力扣35,74
力扣刷题 5

力扣35.搜索插入位置

原题,题目描述:

412218a8-cda7-47d4-968c-4c5f2f370e8c.png

简单题,考察最基本的二分查找,不必多说,直接上代码:

代码一

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length-1, mid;
        while (left <= right) {
            mid = (left + right) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else{
                right = mid - 1;
            }
        }
        return left;
    }
}

力扣74.搜索二维矩阵

原题,题目描述:

d331bf4e-2079-484f-a673-64674c9d98c6.png

这题比起上一题其实也没提高多少难度,只是增加了一个二分查找的维度,我们需要两次二分查找。首先矩阵的行列都是有序递增的,并且后一行的第一个元素一定大于上一行最后一个元素。那我们可以直接对最后一列做二分查找,找到第一个大于目标元素的行。这里直接使用上一题的代码即可。找到行后我们直接对这一行再做二分查找,即可搜索是否包含元素,下面看代码:

代码二

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length, n = matrix[0].length;
        int left = 0, right = m - 1, mid;
        while (left <= right) {
            mid = (left + right) / 2;
            if (matrix[mid][n - 1] == target) {
                return true;
            } else if (matrix[mid][n - 1] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        if(left>=m){
            return false;
        }

        if (matrix[left][0] > target) {
            return false;
        }
        if(matrix[left][0] == target){
            return true;
        }

        int row = left;
        left = 0;
        right = n - 1;
        while (left <= right) {
            mid = (left + right) / 2;
            if (matrix[row][mid] == target) {
                return true;
            } else if (matrix[row][mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return false;

    }
}

代码基本按照思路一比一写的,理解起来应该没有难度。不过这题很有意思的是,直接暴力遍历也是0毫秒,打败百分百。

力扣35,74
https://www.than.pw/archives/019c8998-2928-737c-8907-1972842860a8
作者
than
发布于
更新于
许可