LeetCode 74. Search a 2D Matrix (C++ JavaScript)

来源:互联网 发布:it技术学校 编辑:程序博客网 时间:2024/06/08 16:51

题目描述
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

•Integers in each row are sorted from left to right.
•The first integer of each row is greater than the last integer of the previous row.

For example,
Consider the following matrix:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
Given target = 3, return true.
解题思路:本题就是在一个已经排序的数组中查找给定的值,首先想到的是暴力查找,其次寻求较高效率的算法是二分查找。
解法一:顺序搜索,时间复杂度为O(m*n)。用二重循环遍历整个数组,亲试可以通过。

//C++class Solution {public:    bool searchMatrix(vector<vector<int>>& matrix, int target) {        for(int i=0;i<matrix.size();i++)            for(int j=0;j<matrix[i].size();j++)                if(matrix[i][j]==target)return true;        return false;    }};
//JavaScript/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */var searchMatrix = function(matrix, target) {    for(var i=0;i<matrix.length;i++)    {        for(var j=0;j<matrix[i].length;j++)        {            if(matrix[i][j]==target) return true;        }    }    return false;};

解法二:二分查找,时间复杂度为O(log(n+m))

  • 二分查找基本思想就是在一个有序数列中,用序列中间的值与待查找的值进行比较,如果该值比为待查找的值,则成功返回;如果该值小于待查找的值,说明待查找的值在整个序列的后半部分,令序列的low值为中间值的右侧的值;如果该值大于待查找值,说明待查找的值在整个序列的前半部分,令序列的high值为中间值左侧的值;如果low值大于high则查找结束。
  • 二分查找有递归和非递归算法,本例中用的是非递归算法。
  • 在本例中二位数组是一个已经排序的数列,用二分查找时候需要对数列中的元素的个数标号和数组的下标进行转换。数组的行数为吗,列数为n,数组的下标从0开始,数组中matrx[i][j]在数列中的位置为k,则有如下关系:
    k=i*n+j
    i=k/n
    j=k%n
  • 其他注意事项见代码注释。
class Solution {public:    bool searchMatrix(vector<vector<int>>& matrix, int target) {        int m=matrix.size();        int n=matrix[0].size();        int low=0;        int high=m*n-1;        int mid;        while(low<=high)//此处一定要有等号,否则会出错(一个数),或者死循环(两个数)        {            mid=(low+high)/2;//用除法而不是取模运算            if(matrix[mid/n][mid%n]==target) return true;            else if(matrix[mid/n][mid%n]<target) low=mid+1;//一定要加1            else high=mid-1;//一定要减1        }        return false;    }};
//JavaScript/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */var searchMatrix = function(matrix, target) {    var m= matrix.length;    var n=matrix[0].length;    var low=0;    var high=m*n-1;    var mid;//此处可以不声明mid,下面也可以直接使用    while(low<=high)    {        //JavaScript是若类型,需要用parseInt(String,radix)转为整数。        mid=parseInt((low+high)/2);        if((matrix[parseInt(mid/n)][parseInt(mid%n)]==target))return true;        else if(matrix[parseInt(mid/n)][parseInt(mid%n)]<target) low=++mid;        else high=--mid;    }    return false;};
0 0