假設乙個旋轉排序的陣列其起始位置是未知的(比如0 1 2 4 5 6 7 可能變成是4 5 6 7 0 1 2)。
你需要找到其中最小的元素。
你可以假設陣列中不存在重複的元素。
分析:尋找陣列中某一類特定的值,很容易聯想到二分法。本題中陣列是旋轉的,而且是排序的,還是比較有規律,可以分情況討論mid的落點情況:
public
int findmin(int nums)
int start = 0;
int end = nums.length - 1;
while (start + 1
< end)
int mid = start + (end - start) / 2;
if (!increase(nums, mid)) else
if (nums[mid] > nums[start]) else
}if (nums[start] < nums[end])
if (nums[start] > nums[end])
}//判斷mid是否為遞增,在本題中使用此函式不需擔心下標越界的情況,while的迴圈條件 start + 1 < end 已經保證mid前後必須有值。
private
boolean increase(int nums, int
index) else
}
以上雖然是每次將區間縮小一半,但是判斷過於複雜,不同於以往二分法比較時存在乙個target,接下來引入固定target的思路來解題。
public
intfindmin(int nums)
int start = 0;
int end = nums.length - 1;
int target = nums[nums.length - 1];//此處將target定位陣列中的最後乙個元素,而不能選擇陣列首個元素,因為陣列是公升序、旋轉時的判斷條件不相符。
while (start + 1
< end) else
if (nums[mid] < target) else
}if (nums[start] < nums[end]) else
}
尋找旋轉陣列的最小值
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1。這道題的要求是尋找最小值,附加的條件是給出了兩個有序的陣列。如果旋轉的數字個數大於0 可...
旋轉陣列的最小值
題目 把乙個陣列的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小值。例如陣列為的乙個旋轉,該陣列的最小值為1。解析 1 我們可以用順序查詢的方法找到陣列中的最小值,但是這個方法沒有用到旋轉陣列區域性有序的特點。2 和二分查詢法一樣,我們用兩個指標...
旋轉陣列的最小值
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。思路 類似二分查詢,不斷縮小查詢範圍 int minnumberinro...