Leetcode_search-a-2d-matrix
来源:互联网 发布:client mac addr 编辑:程序博客网 时间:2024/06/14 10:43
地址: http://oj.leetcode.com/problems/search-a-2d-matrix/
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
.
剑指offer上有道题跟这个类似,但是条件没有这么强,是线性的减小搜索范围的。既然是有序的,我认为就应该二分查找。
这道题应该在一个安静的环境下耐心的写。写的时候环境不好,头都大了,写了好久。
参考代码:
class Solution {public: bool searchMatrix(vector<vector<int> > &matrix, int target) { if(matrix.empty()) return false; int row = matrix.size(), col = matrix[0].size(); if(target < matrix[0][0] || target > matrix[row-1][col-1]) return false; int i = 0, endi = row-1; while(i<=endi) { if(target < matrix[(i+endi)/2][0]) { endi = (i+endi)/2-1; } else if(target > matrix[(i+endi)/2][0]) { if(target > matrix[(i+endi)/2][col-1]) i=(i+endi)/2+1; else if(target < matrix[(i+endi)/2][col-1]) { int j = 0, endj = col-1; while(j<=endj) { if(target < matrix[(i+endi)/2][(j+endj)/2]) { endj = (j+endj)/2-1; } else if(target > matrix[(i+endi)/2][(j+endj)/2]) { j = (j+endj)/2+1; } else return true; } return false; } else return true; } else return true; } return false; }};
//SECOND TRIAL
//剪枝再二分搜索
class Solution {public: bool searchMatrix(vector<vector<int> > &matrix, int target) { if(matrix.empty()) return false; int row = matrix.size(), col = matrix[0].size(); int r = 0, c = col-1; while(r < row && c>=0) { if(matrix[r][c] > target) { if(matrix[r][0]>target) return false; else if(matrix[r][0]<target) { int i = 1, j = c-1; while(i<=j) { int mid = (i+j)/2; if(matrix[r][mid]>target) j = mid-1; else if(matrix[r][mid]<target) i = mid+1; else return true; } return false; } else return true; } else if(matrix[r][c] < target) ++r; else return true; } return false; }};
//Thrid trial
//剪枝再线性搜索, 比上一个要差
class Solution {public: bool searchMatrix(vector<vector<int> > &matrix, int target) { if(matrix.empty()) return false; int row = matrix.size(), col = matrix[0].size(); int r = 0, c = col-1; while(r < row && c>=0) { if(matrix[r][c] > target) --c; else if(matrix[r][c] < target) ++r; else return true; } return false; }};
0 0
- Leetcode_search-a-2d-matrix
- leetcode_Search a 2D Matrix
- leetcode_Search a 2D Matrix II
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- Search a 2D Matrix
- 心慈手软
- [ANSYS]重力场考虑与否讨论
- 泛型编程与STL学习-Containers
- Valgrind 介绍
- java类调用简单存储过程--小白同志可以看看@我也是小白
- Leetcode_search-a-2d-matrix
- 面向对象和面向过程的本质区别
- GC(垃圾处理机制)面试题
- 使用Watin做Web UI Automation Test
- class _declspec(dllexport) class_name与class _declspec(dllimport) class_name的配套使用
- 分享30个最佳 jQuery Lightbox 效果插件
- 优先队列
- #pragma预处理命令的使用
- CSS border-style 属性