前言
當前所有算法都使用測試用例運行過,但是不保證100%的測試用例,如果存在問題務必聯(lián)系批評指正~
在此感謝左大神讓我對算法有了新的感悟認識!
問題介紹
原問題
給定一個從小到大有序的數(shù)組,該數(shù)組存在重復的數(shù),并且該數(shù)組可能經(jīng)過旋轉處理,如arr = [1,2,3,4,5,6,7]代表數(shù)組未旋轉,如果arr=[4,5,6,7,1,2,3],則表示該數(shù)組被旋轉了,求該數(shù)組中的最小值
解決方案
原問題:
首先有一個規(guī)律,如果該數(shù)組沒有被旋轉,那么arr[0] 一定小于arr[n-1],否則一定是旋轉過的
沒有重復的情況如上
=
當l = mid = r相同時:
比較極端的情況,但是仍然是遞增數(shù)組
具體代碼請看代碼邏輯處理
代碼編寫
java語言版本
原問題:
方法一:
/**
* 二輪測試:旋轉數(shù)組的二分法查找
* @param arr
* @return
*/
public static int getMinCp1(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int low = 0;
int mid = 0;
int high = arr.length - 1;
while (low < high) {
if (low == high - 1) {
break;
}
if (arr[low] < arr[high]) {
return arr[low];
}
mid = (low + high) / 2;
if (arr[low] > arr[mid]) {
high = low;
continue;
}
if (arr[low] < arr[mid]) {
low = mid;
continue;
}
while (low < mid) {
if (arr[low] < arr[mid]) {
return arr[low];
}else if (arr[low] == arr[mid]) {
low++;
continue;
}else {
high = mid;
break;
}
}
}
return Math.min(arr[low], arr[high]);
}
public static void main(String[] args) {
System.out.println(getMinCp1(new int[] {1,2,3,4,5}));
}
c語言版本
正在學習中
c++語言版本
正在學習中
思考感悟
看完解法,說實話我想用O(n)的解法[苦笑],要分析的情況真的挺復雜,不如直接使用O(N)的解法問題,并且在l=mid=r的情況下仍然存在循環(huán)找數(shù)字的情況,可以作為分析娛樂來,但不建議加到業(yè)務代碼中。文章來源:http://www.zghlxwxcb.cn/news/detail-459458.html
寫在最后
方案和代碼僅提供學習和思考使用,切勿隨意濫用!如有錯誤和不合理的地方,務必批評指正~
如果需要git源碼可郵件給2260755767@qq.com
再次感謝左大神對我算法的指點迷津!文章來源地址http://www.zghlxwxcb.cn/news/detail-459458.html
到了這里,關于【算法】【算法雜談】旋轉數(shù)組的二分法查找的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!