leetcode#74 Search a 2D Matrix
阿新 • • 發佈:2019-01-06
leetcode心得
#74. Search a 2D Matrix
- 用兩次binary search
- 用一次binary search
class Solution { public boolean searchMatrix(int[][] matrix, int target) { //using two binary search //check errors if(matrix==null||matrix.length==0){ return false; } if(matrix[0]==null||matrix[0].length==0){ return false; } int row = matrix.length; int col = matrix[0].length; //通過每一行第一個元素確定在哪一行 int start=0,end=row-1; while(start+1<end){ int mid=start+(end-start)/2; if (matrix[mid][0]==target){ return true; } if(matrix[mid][0]>target){ end=mid; } else { start=mid; } } if(matrix[end][0]<=target){//end必須放在前面,因為start和end可能同時滿足 row=end;//在這裡需要找到目標所在的行 } else if(matrix[start][0]<=target){ //如果這裡改成if,就不正確 row=start; } else{ return false; } //else if(matrix[start][0]<target&&matrix[start+1][0]>target){ 直接順序執行,因為找出了所在行,所以不用判斷,判斷的話會出現會出現越界 int hi=0, lo=col-1; while(hi+1<lo){ int p = hi+(lo-hi)/2; if (matrix[row][p]==target){ return true;} if (matrix[row][p]>target){ lo=p; } else { hi=p; } } if (matrix[row][hi]==target){ return true; } else if (matrix[row][lo]==target){ return true; } return false; } }
用一次二分搜尋 public boolean searchMatrix(int[][] matrix, int target) { // write your code here if(matrix == null || matrix.length == 0){ return false; } if(matrix[0] == null || matrix[0].length == 0){ return false; } int row = matrix.length; int column = matrix[0].length; int start = 0, end = row * column - 1; while(start <= end){ int mid = start + (end - start) / 2; int number = matrix[mid / column][mid % column];//矩陣的正中間點 if(number == target){ return true; }else if(number > target){ end = mid - 1; }else{ start = mid + 1; } } return false; } }