1、一维数组二分查找
思路很简单,low,high,mid。判断mid跟目标值的关系进行下一步操作
2、二维数组查找目标值
数组单行有序,单列有序,首先想到的思路是外层一个循环,内层一个二分查找,时间复杂度为O(NlogM)。
题目要求时间复杂度O(N+M),进一步思考,其实将目标值和二维数组的右上角(左小角也可)元素a[i][j]比较,如果大于,说明当前行的值都小于目标值,i++,如果小于,说明当前列的值都大于目标值,j++。时间复杂度满足要求。
3、寻找峰值
最简单也最容易想到的办法,从头遍历到尾,前后值比较一下就可以。时间复杂度O(N)。
题目要求时间负责度为O(logN),考虑到nums[0]和nums[n]都等于-∞其实可以使用二分查找,如果当前值比其右边值大,则其左边(包括当前值)一定至少存在一个峰值,high = mid;否则,其右边一定至少存在一个峰值,low = mid+1。最后high就是峰值所在位置
4、数组中的逆序对(利用时间复杂度为O(logN)的排序)
5、逆转数组的最小数字
二分查找思路。如果arr[mid]的值大于arr[low],说明最小数字在mid之后,low = mid+1;否则,说明最小数字在mid之前(包括mid),high = mid;最后返回arr[low]。
坑:没注意数组为非降序数组,也即存在重复值。代码需要修改一下,预处理:先筛除掉数组后端跟arr[low]相等的元素。然后如果arr[low] < arr[high] 则返回arr[low],判断条件也需要考虑重复值的情况,改称arr[mid] >= arr[low]。
6、比较版本号
要求空间复杂度O(1),时间复杂度O(n)。思考了一下,没觉得跟二分查找和排序有关。从头往后遍历,将点和点之间的字符串转化为数字,比较数字大小就可以了。
牛客网刷题-二分查找/排序1
于 2023-02-22 18:47:46 首次发布