[LeetCode] Find Minimum in Rotated Sorted Array (包含遞增和遞減旋轉)

執著的Wo牛發表於2014-10-28

原題如下:

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

You may assume no duplicate exists in the array.

例題給出的是遞增序列經過旋轉後得到的,題目本身意思可能也是遞增旋轉,因為系統給出的解法也是針對遞增的。這裡,用的遞迴來解的話,可以避

免原序列的增減情況。主要思想如下:

1、先判斷原序列是不是遞增或遞減序列,是的話,直接返回第一個或最後一個。否則,進行下一步。

2、每次選擇序列第一個、最後一個和中間的3個數字中最大的和最小的,其中,中間位置的數一定是三個當中最大的或最小的(這是因為,序列是由一個sorted array 旋轉而來的);當最後只剩下2個數字時,就是該書組中最小和最大的那2個,若要獲得最小數字,返回較小的數字即可,餘下的那個是陣列中最大的數字。

程式碼如下:

 public int findMin(int[] num) {
	if (num.length == 1)
	    return num[0];

	int mid = (num.length - 1) / 2;
	if (num[mid] >= num[0] && num[mid] <= num[num.length - 1])// 遞增序列
	    return num[0];
	if (num[mid] <= num[0] && num[mid] >= num[num.length - 1])// 遞減序列
	    return num[num.length - 1];

	return searchMin(num, 0, num.length - 1);
}

public int searchMin(int[] num, int start, int end) {
	if (start + 1 == end)
	    return Math.min(num[start], num[end]);

	int mid = (start + end) / 2;
	if (num[mid] > Math.max(num[start], num[end])) {
	    if (num[start] > num[end])
	        return searchMin(num, mid, end);
	    else
	        return searchMin(num, start, mid);
	} else {
	    if (num[start] > num[end])
	        return searchMin(num, start, mid);
	    else
	        return searchMin(num, mid, end);
	}
}



這個是不包含重複序列的,重複序列的解法類似。

相關文章