leetcode:Search a 2D Matrix(数组,二分查找)
2015-10-05 21:15
281 查看
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 =
分析:题意为在一个mxn矩阵中查找目标值。可以先通过二分法确定目标值target可能出现的行,然后再用一次二分法确定目标值target在行中的可能位置。
时间复杂度为O(logn+logm)
code如下:
其他思路:
从左下角元素开始遍历,每次遍历中若与目标值target相等则返回true;若小于则列向右移动;若大于则行向下移动。时间复杂度O(logn+logm)
code如下:
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.
分析:题意为在一个mxn矩阵中查找目标值。可以先通过二分法确定目标值target可能出现的行,然后再用一次二分法确定目标值target在行中的可能位置。
时间复杂度为O(logn+logm)
code如下:
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int left=0; int right=matrix.size()-1; if(left != right){ while(left <= right){ int mid=left + (right-left)/2; if(matrix[mid][0]<target){ left=mid+1; } else if(matrix[mid][0]>target){ right=mid-1; } else { return true; } } } if(right==-1){ return false; } else{ int row=right; int left=0; int right=matrix[row].size()-1; while(left<=right){ int mid=left + (right-left)/2; if(matrix[row][mid]<target){ left=mid+1; } else if(matrix[row][mid]>target){ right=mid-1; } else { return true; } } return false; } } };
其他思路:
从左下角元素开始遍历,每次遍历中若与目标值target相等则返回true;若小于则列向右移动;若大于则行向下移动。时间复杂度O(logn+logm)
code如下:
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int i=matrix.size()-1; int j=0; int m=matrix.size(); int n=matrix[0].size(); while(i>=0 && j<n){ if(matrix[i][j] > target){ i--; } else if(matrix[i][j] == target){ return true; } else{ j++; } } return false; } };
相关文章推荐
- Spark修炼之道(基础篇)——Linux大数据开发基础:第十三节:Shell编程入门(五)
- C#学习日记13---类(Class)的声明与定义
- 通过JavaScript钩子来获取UIWebView视频播放的状态
- 第二十八篇:程序启动原理
- KMP算法的C语言实现
- 文本分类入门(四)训练Part 1
- java的数据类型,几个java小程序
- Android 弹出通知Toast的使用
- ACM学习历程—BNUOJ3685 Building for UN(构造)
- Android 弹出通知Toast的使用
- LeetCode OJ:Three Sum(三数之和)
- 零基础学python-19.10 生成器是单迭代器
- 例题5.22 比赛网络 UVa11865
- 菩萨蛮 寄情愁
- iOS编程------标签视图控制器-UITabBarController
- win8.1上wamp环境中利用apache自带ab压力测试工具使用超简单讲解
- 零基础学python-19.10 生成器是单迭代器
- Java基础知识强化之集合框架笔记38:Set集合之Set集合概述和特点
- Android studio 更新只显示"Download”的解决办法
- 【理解】initWithFrame方法(初始化UIView)