LintCode 二分法查找, 搜索插入位置 和 二维矩阵
2015-10-05 17:02
489 查看
1. 二分查找
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。样例
在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。
挑战
如果数组中的整数个数超过了2^32,你的算法是否会出错?
solution: 注意如果出现重复的数字时我们需要放回第一个出现的位置,因此在使用二分法查找时,我们需要添加一个while循环判断前面是否有相同的数字.
class Solution { public: /** * @param nums: The integer array. * @param target: Target number to find. * @return: The first position of target. Position starts from 0. */ int binarySearch(vector<int> &array, int target) { // write your code here int prev = 0, last = array.size()-1; while (prev <= last) { int mid = (prev + last) / 2; if (target > array[mid]) prev = mid + 1; else if(target < array[mid]) last = mid - 1; else { while (array[mid-1] == target) --mid; return mid; } } return -1; } };
2. 搜索插入位置
给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引。如果没有,返回到它将会被按顺序插入的位置。你可以假设在数组中无重复元素。
样例
[1,3,5,6],5 → 2
[1,3,5,6],2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6],0 → 0
solution:经典的二分查找算法
class Solution { /** * param A : an integer sorted array * param target : an integer to be inserted * return : an integer */ public: int searchInsert(vector<int> &A, int target) { // write your code here int n = A.size(); int prev = 0, last = n - 1; while (prev <= last) { int mid = (prev + last) / 2; if(target > A[mid]) prev = mid + 1; else if (target < A[mid]) last = mid - 1; else return mid; } return prev; } };
3 搜索二维矩阵
写出一个高效的算法来搜索 m × n矩阵中的值。这个矩阵具有以下特性:
每行中的整数从左到右是排序的。
每行的第一个数大于上一行的最后一个整数。
样例
考虑下列矩阵:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3,返回 true
挑战
O(log(n) + log(m)) 时间复杂度
solution: 这题是前面两道题的综合,首先找到target所在的行,然后在所在的列进行查找
code
class Solution { public: /** * @param matrix, a list of lists of integers * @param target, an integer * @return a boolean, indicate whether matrix contains target */ bool searchMatrix(vector<vector<int> > &matrix, int target) { // write your code here if (matrix.size() == 0) return false; int m = matrix.size()-1; int row = 0, last = m, mid; //首先找到元素所在的行 while (row <= last) { mid = (row + last) / 2; if (matrix[mid][0] < target) row = mid + 1; else if (matrix[mid][0] > target) last = mid - 1; else return true; } row -= 1; //注意此处 last = matrix[row].size() - 1; int col = 0; while (col <= last) { mid = (col + last) / 2; if (matrix[row][mid] < target) col = mid + 1; else if (matrix[row][mid] > target) last = mid - 1; else return true; } return false; } };
相关文章推荐
- How to learn wxPython
- 第4周项目3-单链表应用(1)
- 1.Swift 基础语法
- 仿Tomcat应用隔离机制开发Openfire插件隔离功能笔记
- Java核心技术第4章(5)
- ubuntu 14.04 apt-get install 不能自动补全解决办法
- 如何查找综述文献
- 最短路 hnu13430 Elevators
- java 微信与支付宝退款接口开发总结
- 实现android gif图片动画播放功能
- 第四周项目3 -单链表的应用连接
- 第六周上机实践—项目1—建立顺序栈算法库
- 第4周 项目5-猴子选大王
- iOS中的三种定时器使用方法
- 关于ajax的JQuery使用
- 第四周项目1建立单链表
- 第三周 项目3 求集合并集
- BZOJ 3107 [cqoi2013]二进制a+b 分类讨论
- 笔记:学习 Android-BroadcastReceiver
- batch gradient descent和stochastic/incremental gradient descent