天天看點

二維數組中查找數字

二維數組中查找數字

題目連結

https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github

題目描述

給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中。

[
 [1,   4,  7, 11, 15],
 [2,   5,  8, 12, 19],
 [3,   6,  9, 16, 22],
 [10, 13, 14, 17, 24],
 [18, 21, 23, 26, 30]
]

Given target = 5, return true.
Given target = 20, return false.
           
package com.huang.datastructure;

/**
 * @Author hxc
 * @Date 2022/1/4
 */
public class ErArrayDemo {
    /**
     * 給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中。
     *
     * [
     *   [1,   4,  7, 11, 15],
     *   [2,   5,  8, 12, 19],
     *   [3,   6,  9, 16, 22],
     *   [10, 13, 14, 17, 24],
     *   [18, 21, 23, 26, 30]
     * ]
     *
     * Given target = 5, return true.
     * Given target = 20, return false.
     */

    public static void main(String[] args) {
        int[][] arr = new int[5][5];
        arr[0][0] = 1;
        arr[0][1] = 4;
        arr[0][2] = 7;
        arr[0][3] = 11;
        arr[0][4] = 15;

        arr[1][0] = 2;
        arr[1][1] = 5;
        arr[1][2] = 8;
        arr[1][3] = 12;
        arr[1][4] = 19;

        arr[2][0] = 3;
        arr[2][1] = 6;
        arr[2][2] = 9;
        arr[2][3] = 16;
        arr[2][4] = 22;

        arr[3][0] = 10;
        arr[3][1] = 13;
        arr[3][2] = 14;
        arr[3][3] = 17;
        arr[3][4] = 14;

        arr[4][0] = 18;
        arr[4][1] = 21;
        arr[4][2] = 23;
        arr[4][3] = 26;
        arr[4][4] = 30;

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }

        //System.out.println(arr.length);
        //System.out.println(arr[0].length);

        //boolean b = find(100, arr);
        //System.out.println(b);


        boolean b = find2(100, arr);
        System.out.println(b);

    }

     //第一種解法
    public static boolean find(int target,int[][] arr) {
        //給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中。
        //時間複雜度為 O(N²)
        if(arr == null || arr.length == 0 || arr[0].length ==0) {
            return false;
        }
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                if(arr[i][j] == target) {
                    return true;
                }
            }
        }
        return false;
    }

    //第二種解法
    public static boolean find2(int target,int[][] arr) {
        //給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中。
        //時間複雜度為 O(M+N)
        if(arr == null || arr.length == 0 || arr[0].length ==0) {
            return false;
        }
        int rows = arr.length,cols = arr[0].length;
        //二維數組中的一個數,它的左邊都比它小,它的下邊都比它大,所有可以從右上角開始,左下角結束
        //從右上角開始
        int r = 0,c = cols - 1;
        while (r <= rows - 1 && c >= 0){
            if(target == arr[r][c]){
                return true;
            }else if(target > arr[r][c]){
                r++;
            }else {
                c--;
            }
        }
        return false;
    }

}