算法:数组上二分问题

问题A:

有序数组旋转一次后的最值:
例如,4 5 6 7 1 2 3

二分搜索,平均O(logN),最差O(N)

如果num[low] = = num[mid] = = num[high]
num[i++] 向右遍历,寻找下一个可以二分的点。

三种情况:
1,num[low] > num[i] , num[i] 就是断点
2,num[low] < num[i] , 断点在num[i … mid] 上
3,i == mid 都没有出现,则断点在num[mid … high]上


问题B:
有序数组旋转一次后的查找定值:
更复杂一些,依然可以二分搜索,条件较多。最差O(N)


问题C:
数组中逆序数对数量:

归并排序,时间O(NlogN)
比较左划分和右划分,遍历左划分数 二分找 该数大于右划分数的下标,则下标前数字与左划分数都可以构成逆序数对,然后合并左右划分。


问题D:
长度相等的两个有序数组找上中位数:

二分查找,时间O(logN)

通过比较两个数的中位数,来逐步缩小范围。


问题E:
在两个有序数组找第K小的数:

二分查找,时间O(logN)

较短数组S长SL,较长数组L长LL。

k小无解情况不讨论:

若k<SL,则直接取S和L中k小个数,使用“长度相等的两个有序数组找上中位数”。

若k>LL,则直接取S和L中 (SL+LL-k )大个数,使用同样方法找上中位数。

若SL<k<LL,则S中每个数都有可能是k小,L中区间[K-SL,K]上存在k小,其他不可能,同时,[K-S,K]的长度等同于SL,所以使用同样方法找上中位数。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值