[LeetCode]74.Search a 2D Matrix

【题目】

Write an efficient algorithm that searches for a value in anmxnmatrix. 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]]

Giventarget=3, returntrue.

【思路一】

杨氏矩阵解法:

(1)如果数组中选取的数字刚好和查找的数字相等,查找结束,返回true

(2)如果数组中选取的数字小于查找的数字,根据排序规则,要查找的数字只能在当前选取的数字的右边。列数减一。

(3)如果数组中选取的数字大于查找的数字,,根据排序规则,要查找的数字只能在当前选取的数字的下边。行数加一。

时间复杂度:O(m+n)

【代码】

/*————————————* 日期:2015-02-04* 作者:SJF0115* 题目: 74.Search a 2D Matrix* 网址:https://oj.leetcode.com/problems/search-a-2d-matrix/* 结果:AC* 来源:LeetCode* 博客:—————————————*/#include <iostream>#include <vector>#include <cstring>#include <algorithm>using namespace std;class Solution {public:bool searchMatrix(vector<vector<int> > &matrix, int target) {if(matrix.empty()){return false;}//ifint row = matrix.size();int col = matrix[0].size();int x = 0,y = col – 1;// 杨氏矩阵解法从右上角元素开始while(x < row && y >= 0){if(matrix[x][y] == target){return true;}//ifelse if(matrix[x][y] < target){++x;}//elseelse{–y;}}//whilereturn false;}};int main(){Solution s;int target = 3;vector<vector<int> > matrix = {{1,3,5,7},{10,11,16,20},{23,30,34,50}};bool result = s.searchMatrix(matrix,target);// 输出cout<<result<<endl;return 0;}

【思路二】

根据排序规则,我们可以把矩阵看成一个串联起来的一维数组。正好可以利用二分查找。

n*m矩阵转换为一维数组:matrix[x][y] -> a[x*m + y]

一维数组转换为矩阵:a[x] -> matrix[x / m][ x % m]

时间复杂度:O(nmlognm)

【代码二】

/*————————————* 日期:2015-02-04* 作者:SJF0115* 题目: 74.Search a 2D Matrix* 网址:https://oj.leetcode.com/problems/search-a-2d-matrix/* 结果:AC* 来源:LeetCode* 博客:—————————————*/class Solution {public:bool searchMatrix(vector<vector<int> > &matrix, int target) {if(matrix.empty()){return false;}//ifint row = matrix.size();int col = matrix[0].size();int start = 0,end = row * col – 1;// 二分查找解法int mid,x,y;while(start <= end){mid = start + (end – start) / 2;x = mid / col;y = mid % col;if(matrix[x][y] == target){return true;}//ifelse if(target > matrix[x][y]){start = mid + 1;}//elseelse{end = mid – 1;}//else}//whilereturn false;}};

人,总是很难改正自己的缺点,

[LeetCode]74.Search a 2D Matrix

相关文章:

你感兴趣的文章:

标签云: