1. 程式人生 > >劍指offer:二維數組中的查找

劍指offer:二維數組中的查找

bre block tex microsoft blog 一個 lan 編碼 ati

題目描述

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

解題思路

  1. 把每一行看成有序遞增的數組,利用二分查找,通過遍歷每一行得到答案,時間復雜度是nlogn
public class Solution {     public boolean Find(int [][] array,int target) {          for(int i=0;i<array.length;i++){             int low=0;             int
high=array[i].length-1; while(low<=high){ int mid = low + (high-low)/2; // int mid=(low+high)/2; 可能溢出 if(target>array[i][mid]) low=mid+1; else if(target<array[i][mid]) high=mid-1
; else return true; } } return false; } }

  1. 利用二維數組由上到下,由左到右遞增的規律,
    那麽選取右上角或者左下角的元素a[row][col]與target進行比較,
    當target小於元素a[row][col]時,那麽target必定在元素a所在行的左邊,
    即col–;
    當target大於元素a[row][col]時,那麽target必定在元素a所在列的下邊,
    即row++;

註:為什麽不從左上角開始搜尋,因為左上角向右和向下都是遞增,那麽對於一個點,對於向右和向下會產生一個岔路

,不利於編碼;但是如果我們選擇從左下腳開始搜尋的話,如果大於就向右,如果小於就向下。

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

劍指offer:二維數組中的查找