劍指Offer #01 二維數組中的查找(Java描述)

題目來源:牛客網-劍指Offer專題
題目地址:二維數組中的查找

題目描述

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

題目解析

方法一:
暴力法,遍歷二維數組,時間複雜度爲 O(n2)O(n^2)

public class Solution {
    public boolean Find(int target, int [][] array) {
        for (int i = 0; i < array.length; i++){
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] == target)
                    return true;
            }        
        }
        return false;
    }
}

方法二:
根據題目信息可以知道,每一行的數字都是有序的。於是,我們對每一行都進行二分查找,時間複雜度O(nlogn)O(nlogn)

public class Solution {
    public boolean Find(int target, int [][] array) {
        for (int i = 0; i < array.length; i++){
        	//注意搜索的邊界
            int left = 0, right = array[i].length - 1;
            while (left <= right) {
                int mid = (left + right) / 2;
                if (array[i][mid] > target) {
                    right = mid - 1;
                } else if (array[i][mid] < target) {
                    left = mid + 1;
                } else {
                    return true;
                }
            }
        }
        return false;
    }
}

方法三:
由於在數組在水平和垂直方向都是遞增的,所以我們可以從左下角開始,若當前值 nownow 比目標值 targettarget 大,則向上移動;若 now<targetnow <target ,則向右移動。以這種方法去搜尋目標值,時間複雜度O(n)O(n)
在這裏插入圖片描述

public class Solution {
    public boolean Find(int target, int [][] array) {
        int row = array.length - 1, col = 0;
        while (row >= 0 && col < array[row].length) {
            if (array[row][col] > target) {
                row--;
            } else if (array[row][col] < target) {
                col++;
            } else {
                return true;
            }
        }
        return false;
    }
}

如果本文對你有所幫助,別忘了點贊哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章