您的位置:首页 > 其它

杨氏矩阵

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;
}

}


算法分析



注意:该算法也可以使用在上面一题,更具有普遍性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: