package com.study;
/* * 求旋轉陣列的最小數字
* 設定:輸入遞增排序陣列的乙個旋轉
* 要求返回最小的數
* */
public class suanfa6 ;
//private static int arr = ;
private static int arr = ;
// private static int arr =
// private static int arr = ;
public static int rotate(int arr)
else if (after - pre == 1)
for (pre = 1, after = arr.length - 2; pre <= after; pre++, after--)
if (arr[pre] - arr[after] > dif) else
} return -1;
} public static int findindex(int arr, int pre, int after)
return pre;
} public static int rotatenew(int arr)
mid = (pre + after) / 2;
if (arr[pre] == arr[after] && arr[pre] == arr[mid])
mid = findindex(arr, pre, after);
if (arr[pre] <= arr[mid])
pre = mid;
else if (arr[pre] >= arr[mid])
after = mid;
} return arr[mid];
/** int mid = (pre + after) / 2; while (arr[pre] < arr[mid])
* * if (arr[pre] > arr[mid])
*/} public static void main(string args)
}
1.rotate函式是自己做的一版,自己選了多組測試例都通過了,好像沒啥問題。但是較為繁瑣。思路是通過首尾兩個指標,分別往中間靠攏,然後比較首尾之差,我的理解是因為前面部分也遞增,後面也是遞增,所以差會越來越大,終止條件就是首尾指標碰到一塊或者出現了負數,也就是兩個指標都跑到乙個遞增部分了。但是期間,要考慮各種不對稱情況,且演算法複雜度較高。
2.rotatenew函式是自己參照劍指offer書上的答案寫的,演算法複雜度降到了o(logn),是二分法的乙個發散,相當經典,值得學習。且考慮了 1,0,1,1類似這種非遞減序列的情況。
3.注釋部分是自己的另一種思路,實現過程中各種問題,還是沒有把二分的思路應用到解題中,汗!
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...
6 求旋轉陣列的最小數字
旋轉陣列 把陣列的前一部分放到陣列的末尾,稱為旋轉陣列 eg 陣列 3,4,5,1,2 為陣列 1,2,3,4,5 的旋轉陣列。輸入乙個 非遞減 陣列的乙個旋轉陣列,求該陣列的最小元素,若陣列大小為0,返回0 普通解法 遍歷陣列,求取陣列的最小元素,時間複雜度o n 不作解釋,不貼 了 二分查詢法 ...