leetcode 074 —— Search a 2D Matrix
2015-07-31 15:37
309 查看
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 =
思路:从左上角或者右下角的顶点开始搜索
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
int n = matrix[0].size();
int i = 0, j = n - 1;
while (i<m&&j >= 0){
if (matrix[i][j] == target)
return true;
else if (matrix[i][j]>target)
j--;
else
i++;
}
return false;
}
};
第二种方法:最优路径搜索,也能通过,16ms,但是程序有待优化
class Solution {
public:
<span style="white-space:pre"> </span>bool searchMatrix(vector<vector<int>>& matrix, int target) {
<span style="white-space:pre"> </span>vector<vector<int>> &a = matrix;
<span style="white-space:pre"> </span>int m = a.size();
<span style="white-space:pre"> </span>int n = a[0].size();
<span style="white-space:pre"> </span>int i = 0, j = 0;
<span style="white-space:pre"> </span>while (i<m&&j<n){
<span style="white-space:pre"> </span>if (a[i][j]>target) return false;
<span style="white-space:pre"> </span>if (a[i][j] == target) return true;
<span style="white-space:pre"> </span>if (i == m - 1){
<span style="white-space:pre"> </span>while (j < n){
<span style="white-space:pre"> </span>if (a[i][j] == target) return true;
<span style="white-space:pre"> </span>else if (a[i][j] < target) j++;
<span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (j == n - 1){
<span style="white-space:pre"> </span>while (i < m){
<span style="white-space:pre"> </span>if (a[i][j] == target) return true;
<span style="white-space:pre"> </span>else if (a[i][j] < target) i++;
<span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (a[i + 1][j] < target&&a[i][j + 1] < target){
<span style="white-space:pre"> </span>if (a[i + 1][j]>a[i][j + 1]) i++;
<span style="white-space:pre"> </span>else j++;
<span style="white-space:pre"> </span>continue;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (a[i + 1][j]>target&&a[i][j + 1]>target) return false;
<span style="white-space:pre"> </span>if (a[i + 1][j] == target || a[i][j + 1] == target) return true;
<span style="white-space:pre"> </span>if (a[i + 1][j]<target&&a[i][j + 1]>target){
<span style="white-space:pre"> </span>i++;
<span style="white-space:pre"> </span>continue;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (a[i + 1][j] > target&&a[i][j + 1] < target){
<span style="white-space:pre"> </span>j++;
<span style="white-space:pre"> </span>continue;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
}a;
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.
思路:从左上角或者右下角的顶点开始搜索
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
int n = matrix[0].size();
int i = 0, j = n - 1;
while (i<m&&j >= 0){
if (matrix[i][j] == target)
return true;
else if (matrix[i][j]>target)
j--;
else
i++;
}
return false;
}
};
第二种方法:最优路径搜索,也能通过,16ms,但是程序有待优化
class Solution {
public:
<span style="white-space:pre"> </span>bool searchMatrix(vector<vector<int>>& matrix, int target) {
<span style="white-space:pre"> </span>vector<vector<int>> &a = matrix;
<span style="white-space:pre"> </span>int m = a.size();
<span style="white-space:pre"> </span>int n = a[0].size();
<span style="white-space:pre"> </span>int i = 0, j = 0;
<span style="white-space:pre"> </span>while (i<m&&j<n){
<span style="white-space:pre"> </span>if (a[i][j]>target) return false;
<span style="white-space:pre"> </span>if (a[i][j] == target) return true;
<span style="white-space:pre"> </span>if (i == m - 1){
<span style="white-space:pre"> </span>while (j < n){
<span style="white-space:pre"> </span>if (a[i][j] == target) return true;
<span style="white-space:pre"> </span>else if (a[i][j] < target) j++;
<span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (j == n - 1){
<span style="white-space:pre"> </span>while (i < m){
<span style="white-space:pre"> </span>if (a[i][j] == target) return true;
<span style="white-space:pre"> </span>else if (a[i][j] < target) i++;
<span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (a[i + 1][j] < target&&a[i][j + 1] < target){
<span style="white-space:pre"> </span>if (a[i + 1][j]>a[i][j + 1]) i++;
<span style="white-space:pre"> </span>else j++;
<span style="white-space:pre"> </span>continue;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (a[i + 1][j]>target&&a[i][j + 1]>target) return false;
<span style="white-space:pre"> </span>if (a[i + 1][j] == target || a[i][j + 1] == target) return true;
<span style="white-space:pre"> </span>if (a[i + 1][j]<target&&a[i][j + 1]>target){
<span style="white-space:pre"> </span>i++;
<span style="white-space:pre"> </span>continue;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (a[i + 1][j] > target&&a[i][j + 1] < target){
<span style="white-space:pre"> </span>j++;
<span style="white-space:pre"> </span>continue;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
}a;
相关文章推荐
- 如何实现HTTP DIGEST认证
- 探究Android系统中解析JSON数据的方式
- 判断填写的邮箱里是否有“@”
- 关于将Webpack,编译文件输出到不同的目录下
- C语言——计算文件大小(二)
- 黑马程序员-------集合框架之HashSet
- FFT模板
- 搞颠provider,factory 和service
- oracle,mysql,SqlServer三种数据库的分页查询总结
- Java File类学习笔记3:自定义一个类,读取文本内容到字符串
- cookie和session
- [leetcode-42]Trapping Rain Water(java)
- phpmyadmin的设置
- 获取当前路径
- PNG文件格式
- Stub vs. Skeleton
- MongoDb复制-主从复制
- C++的动态内存管理,new/delete
- 淘宝api订单接口R2字段模糊化处理通知【白名单更新】
- ViewDragHelper详解