劍指offer算法題作題筆記

題目描述

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

解題思路

由題目可知,該數組具有如下性質:從左到右升序,從上到下升序。把二維數組當作矩陣形式的話,也就是說每一個元素比左邊的元素大,比右邊的元素小,比上邊的元素大,比下邊的元素下。所以能夠獲得這麼一個結論:當整數A大於該數組中的元素B時,那麼A必然不在B的上方,也不在B的左方,只需往B的下方和右方查找便可;當整數A小於該數組中的元素B時,那麼A必然不在B的下方和右方,只需往B的上方和左方查找便可。
既然知道了數組的這個性質,那麼該如何應用它呢?如下圖爲例,假如要尋找的數是n,試一下從左上角第一個元素1開始搜索,若是n比1大,能夠獲得結論:若是數組內存在n的話,他必然在1的右方或下方,往這兩個方向搜索便可。可是這個結論並不能幫助咱們,由於有兩個搜索方向,不知道選哪一個。可是從左下角和右上角兩個地方開始就不同了,以左下角爲例,假如n大於左下角的元素7,那麼根據數組的性質,n也大於7上邊和左邊的全部元素,7是左下角的元素,只有上方有元素,所以能夠排除7上方全部的元素,既第一列的全部元素均可以排除掉;假如n小於7,那麼因爲7右邊的全部元素都比7小,那麼n必然比這些元素小,因此這一列的全部元素也均可以排除。能夠發現,無論n比7大也好,比7小也好,均可以直接排除掉1行或1列的元素,所以最壞狀況下的時間複雜度是m+n。函數

圖片描述

代碼

`spa

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

}`code

相關文章
相關標籤/搜索