leetcode 74:Search a 2D Matrix
2015-11-26 20:57
495 查看
题目:
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:
Given target =
思路:
本题可以用二分法来解。注意到将这个数组从第一行第一个从0开始编号,下一行的第一个接上一行的最后一个,最后一个的序号为n1*n2-1;
那么每个元素按照我们编号的顺序是严格递增的。
所以我们可以对index从0-n1*n2-1用二分法来做,唯一要解决的是将index还原到数组中对应的行号和列号。当然这非常容易;
时间复杂度:O(lg(n1*n2))
实现如下:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int size1 = matrix.size();
if (size1 < 1) return false;
int size2 = matrix[0].size(),n=size1*size2;
if (size2 == 0) n = size1;
int left = 0, right = n - 1,index=n/2;
while (left <= index && index <= right)
{
int row = index / size2, column = index%size2;
if (matrix[row][column] == target) return true;
if (matrix[row][column] > target)
{
right = index - 1;
index -= (index - left + 1) / 2;
}
else
{
left = index + 1;
index += (right - index + 1) / 2;
}
}
return false;
}
};
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.
思路:
本题可以用二分法来解。注意到将这个数组从第一行第一个从0开始编号,下一行的第一个接上一行的最后一个,最后一个的序号为n1*n2-1;
那么每个元素按照我们编号的顺序是严格递增的。
所以我们可以对index从0-n1*n2-1用二分法来做,唯一要解决的是将index还原到数组中对应的行号和列号。当然这非常容易;
时间复杂度:O(lg(n1*n2))
实现如下:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int size1 = matrix.size();
if (size1 < 1) return false;
int size2 = matrix[0].size(),n=size1*size2;
if (size2 == 0) n = size1;
int left = 0, right = n - 1,index=n/2;
while (left <= index && index <= right)
{
int row = index / size2, column = index%size2;
if (matrix[row][column] == target) return true;
if (matrix[row][column] > target)
{
right = index - 1;
index -= (index - left + 1) / 2;
}
else
{
left = index + 1;
index += (right - index + 1) / 2;
}
}
return false;
}
};
相关文章推荐
- 获取本地音频文件 FreeStreamer播放本地音频
- VAO VBO IBO大乱炖
- 元对象、 属性 和 反射编程
- Combination Sum II
- android deamon
- 找规律小总结~
- 深度优先遍历
- cap deploy:setup报错
- 设计模式 - 迭代器模式
- Battle ships(二分图,建图,好题)
- 【linux】关于TCP三次握手和四次挥手
- Web Services 指南之:为何要使用 Web Services
- Ubuntu中rename命令
- Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)
- iOS 深入浅出block系列(1)
- 九度oj-1464-Hello World for U
- Web Services 指南之:为何要使用 Web Services
- 算法(三)粒子群算法之算法分类
- fastJson解析
- hdu1233 还是畅通工程