(1条消息) 跳槽必刷算法题系列(一)

今天是小浩算法 “365刷题” 第104天

问:程序员最讨厌康熙的哪个儿子。

答:胤禩。

01

PART

搜索二维矩阵

这道题目非常的高频!看起来是在考察矩阵搜索,其实和矩阵一点关系都没有....

第74题:编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。

  • 每行的第一个整数大于前一行的最后一个整数。

示例 1:

输入:

matrix = [

[1,   3,  5,  7],

[10, 11, 16, 20],

[23, 30, 34, 50]

]

target = 3

输出: true

示例 2:

输入:

matrix = [

[1,   3,  5,  7],

[10, 11, 16, 20],

[23, 30, 34, 50]

]

target = 13

输出: false

题目本身还是比较容易理解的,没有太多额外补充。

02

PART

题解分析

说白了,这就是一道考察二分的题目。

最重要的是题中给出的两个条件:

  • 每行的第一个整数大于前一行的最后一个整数。

  • 每行中的整数从左到右按升序排列。

第一个条件意味着可以通过二分搜索确定哪行;

第二个条件意味着可以在行里进行二分搜索确定哪个元素;

如何使用二分查找找到哪行呢?只需要一个上下边界,再每次拿着中间行最大的值和目标值比一比。

1//JAVA2    public int getRow(int[][] matrix, int target) {3        //二分法找到target所在的行4        int top = 0, bottom = matrix.length - 1;5        int col = matrix[0].length - 1;6        while (top < bottom) {7            int mid = (top + bottom) / 2;8            if (matrix[mid][col] < target)9                top = mid + 1;10            else11                bottom = mid;12        }13        return top;14    }

找到是哪行之后,就和正常的二分查找没有什么区别了:

1//JAVA2    public boolean find(int[] data, int target) {3        //二分查找4        int l = 0, r = data.length - 1;5        while (l <= r) {6            int mid = (l + r) / 2;7            if (data[mid] == target)8                return true;9            else if (data[mid] < target)10                l = mid + 1;11            else12                r = mid - 1;13        }14        return false;15    }

然后再把代码拼凑到一起:

1//JAVA2class Solution {3    public boolean searchMatrix(int[][] matrix, int target) {4        if (matrix.length < 1) return false;5        int row = getRow(matrix, target);6        return find(matrix[row], target);7    }89    public int getRow(int[][] matrix, int target) {10        int top = 0, bottom = matrix.length - 1;11        int col = matrix[0].length - 1;12        while (top < bottom) {13            int mid = (top + bottom) / 2;14            if (matrix[mid][col] < target)15                top = mid + 1;16            else17                bottom = mid;18        }19        return top;20    }2122    public boolean find(int[] data, int target) {23        int l = 0, r = data.length - 1;24        while (l <= r) {25            int mid = (l + r) / 2;26            if (data[mid] == target)27                return true;28            else if (data[mid] < target)29                l = mid + 1;30            else31                r = mid - 1;32        }33        return false;34    }35}

03

PART

小知识

斐波那契数列是以兔子繁殖为例子而引入的,所以又称为“兔子数列”。指的是这样一个数列:从第3项开始,每一项都等于前两项之和。

(1+1=2,2+1=3,2+3=5.....21+5+8=21+13=34)

(0)

相关推荐