牛客网刷题-二分查找/排序1

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)。思考了一下,没觉得跟二分查找和排序有关。从头往后遍历,将点和点之间的字符串转化为数字,比较数字大小就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值