问题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,所以使用同样方法找上中位数。