給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中。編程
Consider the following matrix: [ [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.
時間複雜度 O(M + N),空間複雜度 O(1)數組
若逐行或逐列用二分法遍歷,效率太慢了,咱們但願能夠以對角線的方向去遍歷,ide
對角線方向有4種:spa
1. 從左上角向右下角出發:往左往下的數都是比當前大的,不可用二分法,放棄;code
2.從右上角向左下角出發: 往左的數變小,往下的數增大,可用二分法;blog
3.從左下角向右上角出發:往上的數變小,往右的數增大,可用二分法;排序
4.從右下角向左上角出發:往上的數變小,往左的數變小,不可用二分法,放棄;get
咱們來實現第3種方法,第2種留給讀者實現io
public class Solution { public boolean Find(int target, int [][] array) { int rows=array.length,cols=array[0].length; int c=0,r=rows-1; while(r>=0&&c<=cols-1){ if(array[r][c]==target){ return true; } if(array[r][c]>target) r--; else c++; } return false; } }