13. <tag-数组和二分查找_2>-lt.240-搜索二维矩阵 || + lt.633-平方数之和 +lt.69-Sqrt(x) (待补充)

lt.240-搜索二维矩阵 ||

[案例需求]
在这里插入图片描述
在这里插入图片描述

优化1. 二分查找法

[思路分析]

  • 本题, 从基础的倒序遍历解法上来看, 跟之前做过的一道题((lt.74-搜索二维矩阵)[https://blog.csdn.net/nmsLLCSDN/article/details/121284683])完全类似

  • 这里, 我们采用二分查找法解题;

  • 要注意到的是: 与 ((lt.74-搜索二维矩阵)[https://blog.csdn.net/nmsLLCSDN/article/details/121284683])不同,本题没有确保「每行的第一个整数大于前一行的最后一个整数」,因此我们无法采取「两次二分」的做法。只能退而求之,遍历行/列,然后再对列/行进行二分。

  • 首先我们对二维数组遍历每一行, 跟倒序遍历相似

      1. 第一层循环, 我们遍历二维数组的每一行,
      1. 如果 某一行末尾的数 < target , 那么由于行升序的原因, 可以直接跳出本次遍历;
      1. 如果 某一行末尾的数 > target , 说明target可能是在这一行, 就在这一行进行二分查找, 取本行的第一个数作为left指针, 最后一个数作为right指针,
      1. 如果前面的二分查找没找到, 就继续下一行的循环;

[代码实现]

    class Solution {
    
    
        public boolean searchMatrix(int[][] matrix, int target) {
    
    
            //倒序遍历
            for(int i = 0; i < matrix.length; i++){
    
    
                int L = 0;
                int R = matrix[i].length - 1;
                
                if(matrix[i][R] < target) continue;

                while(L <= R){
    
    
                    int mid = L + (R - L)/2;
                    if(matrix[i][mid] == target){
    
    
                        return true;
                    }else if(matrix[i][mid] < target){
    
    
                        L = mid + 1;
                    }else if(matrix[i][mid] > target){
    
    
                        R = mid - 1;
                    }
                }
            }
            return false;
        }
    }

在这里插入图片描述

  • 相比前面文章写道的倒序遍历, 其实提高并不是很大, 这里主要是因为采用倒序遍历跟二分法时, 我们都对 target > 每行末尾最后一个数的这样的行, 做了跳过本行的操作(因为每行是升序的嘛, 最后一个数都小于 target了, 哪还有向前遍历的需要啊), 而在target < 某一行末尾的最后一个数这样的行里, 我们才对行中的数进行倒序遍历(或二分查找), 倒序遍历和二分查找的差别就是在这样行里, 所以优化提升非常有限;

优化2. 利用单调性(把行升序列升序两个条件同时利用起来)

[思路分析]
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//单调性
        int rowLen = matrix.length;
        int colLen = matrix[0].length;


        int i = 0;
        int j = colLen - 1;

        while(i < rowLen && j >=0){
    
    
            if(matrix[i][j] < target){
    
    
                i++;
            }else if(matrix[i][j] > target){
    
    
                j--;
            }else{
    
    
                return true;
            }
        }

        return false;

在这里插入图片描述

lt.633-平方数之和

[案例需求]
在这里插入图片描述

[思路分析]

在这里插入图片描述

[代码实现]

class Solution {
    
    
    public boolean judgeSquareSum(int c) {
    
    
        //非负整数, 0,1,2,3,4...
        //左右指针法
        long L = 0;
        long R = (long)Math.sqrt(c);

        while(L <= R){
    
    
            long res = L * L + R * R;

            if(res == c){
    
    
                return true;
            }else if(res > c){
    
    
                R--;
            }else if(res < c){
    
    
                L++;
            }
        }

        return false;
    }
}

在这里插入图片描述


lt.69-Sprt(x)

[案例需求]
在这里插入图片描述

[思路分析]

[代码实现]



猜你喜欢

转载自blog.csdn.net/nmsLLCSDN/article/details/121831221