杨氏矩阵
2017-02-11 15:52
232 查看
Search a 2D Matrix
题目来源:leetcode 74
解题思路
确定行时,是通过最后一列来求(因为:之前有一道题是求插入位置:http://blog.csdn.net/hellotomhaha/article/details/54974443 由该题知道,最终start是返回插入位置,也就是start所在位置原本数字比target大,start-1所在位置的数字比target小;所以知道本题中,最终start所指的是所在行)
-
bool searchMatrix(vector<vector<int> > & matrix, int target) { if (matrix.size()==0||matrix[0].size()==0) { return false; } else{ int row_len = matrix.size(); int col_len = matrix[0].size(); int start=0; int end=row_len-1; int mid; int row; while (start<=end) { //先寻找行号,在矩阵的最后一列使用二分查找 mid = (start+end)/2; if (target==matrix[mid][col_len-1]) { return true; //如果最后一列直接找到,则返回ture;如果没找到则返回start也就是可能所在行 } else if(target<matrix[mid][col_len-1]){end=mid-1;} else start=mid+1; } row = start; //可能所在行等于start,也就是对最后一列使用二分查找后start的值 if (row<row_len) { //当可能所在行没有越界时,对row所在行进行二分查找 start=0; end = col_len-1; while (start<=end) { mid = (start+end)/2; if (target==matrix[row][mid]) { return true; } else if(target<matrix[row][mid]){end=mid-1;} else start=mid+1; } return false; //当在可能所在行没有找到时,返回false } else //当可能所在行越界时,则说明肯定不存在,返回false b33a return false; } }
算法分析
杨氏矩阵 2
题目来源:leetcode 240注意与上一题的区别:
该题中前面行的较大数字有可能大于后面行的较小数字
思路分析
#include <stdio.h> #include <vector> using namespace std; bool searchMatrix(vector<vector<int> >& matrix, int target) { if(matrix.size()==0||matrix[0].size()==0){return false;} else{ int i=0; //定义两个指针,一个为i指向第一行,一个为j指向最后一列 int j=matrix[0].size()-1; while (j>=0&&i<matrix.size()) { //比较matrix[i][j]和target;当和target相等时则返回true;当比target大时,j指针向左移动;当比target小时,i指针向下移动 if (matrix[i][j]==target) {//和target相等时则返回true return true; } else if(matrix[i][j]>target){ //当比target大时,j指针向左移动; j--; } else{ //当比target小时,i指针向下移动 i++; } } if (i>=matrix.size()||j<0) { //指针i或者j越界时,返回false return false; } else return true; } }
算法分析
注意:该算法也可以使用在上面一题,更具有普遍性
相关文章推荐
- 剑指offer-和为S的两个数组-两根指针
- 努比亚Z11 mini打开USB调试模式与工程端口的方法
- 创建JSTL标签库
- Vue.js 源码学习笔记 - 细节
- Vue.js 源码学习笔记 -- 分析前准备1 -- vue三大利器
- # 人月神话笔记
- Kotlin VS Java:基本语法差异
- 差距:我是如何一步步落后于别人
- pat a1004(暂缺)
- 1055. The World's Richest (25)
- 深入分析javaweb技术内幕5---Jetty、Spring、Spring MVC
- 题目1072:有多少不同的面值组合?
- UVA 147 Dollars (子集和问题 & DP)
- hdu1863 畅通工程
- java.util.concurrent包中线程池Executors的使用
- T-SQL 语言基础(五)—— 流程控制语句
- 每天一个linux命令:df 命令
- SpringMVC4 跨域 配置
- NoSql
- C++ std::vector<bool>