T240 快速搜索二维矩阵

CASE1:思想:分治法:
矩阵左下角那个元素既是它所在那行的最小元素也是他所在那列的最大元素,所以说以其作为突破口
当左下角元素==target时return true
<target时 往右走
>target时 往上走

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

CASE 2:使用跳表思想结合二分查找
step1:对行进行二分查找,该下标idx即为在该行中插入target时的下标!!!,判断idx是否合法
如果合法(idx<col不用判断idx是否>=0因为二分法返回的idx恒>=0)直接判断该行下标为idx的元素是否为target,不是则转step2;
不合法(idx>=cols||idx==0时)做相应处理:
1)若idx=0则表示待查找元素要么小于该行的第一个元素即不存在要么等于第一个元素, 所以直接return matrix[r][idx]==target
2)若idx>=col,则表示待查找元素>该行所有元素则进入下一行
step2:再对下一行指定范围内做二分查找重复上述步骤
即判断if(matrix[r+1][idx]==target) return true;
if(matrix[r+1][idx]<target) binarySearch(matrix[r+1],0,idx+1,target)
if(matrix[r+1][idx]>target) binarySearch(matrix[r+1],idx+1,cols,target)

class Solution {
    /*
  
    */
    public int binarySearch(int[]temp,int start,int end,int target){
        //至少有元素时才进行二分
        if(start<=end){
          int mid = (start+end)/2;
          if(temp[mid]==target) return mid;
          if(temp[mid]<target){
              return binarySearch(temp,mid+1,end,target);
          }
          return binarySearch(temp,start,mid-1,target);
        }
        return start;
    }
    public boolean searchMatrix(int[][] matrix, int target) {
        int r = 0;
        int rows = matrix.length;
        int start = 0;
        int col = (rows>0)?matrix[0].length:0;
        if(col==0) return false;
        int end = col-1;
        int idx = 0;
        int temp = 0;
        while(r<rows){
         idx = binarySearch(matrix[r],start,end,target);
         //
         if(idx==0){
          return matrix[r][idx]==target;
         } 
         else if(idx>=col){
           r++;
         }else{
           //特别注意这里若idx合法则直接判断就行了 
           if(matrix[r][idx]==target) return true;
           else if(matrix[r][idx]<target){
               start = idx+1;
               r++;
           }else{
               end = idx-1;
               r++;
           }
         } 
         
        }
       return false; 
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值