「leetcode系列」第三十一期 尋找旋轉排序陣列中的最小值

本期帶了了兩道題目,有簡單的先入手。

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

請找出其中最小的元素。

你可以假設陣列中不存在重複元素。

示例 1:

輸入: [3,4,5,1,2]

輸出: 1

示例 2:

輸入: [4,5,6,7,0,1,2]

輸出: 0

連結:https://leetcode-cn。com/problems/find-minimum-in-rotated-sorted-array

和在有序陣列中查詢指定數一樣,這裡再旋轉陣列中查詢最小值,可以使用二分法進行查詢。程式碼如下

/**

* @param {number[]} nums

* @return {number}

*/

var findMin = function(nums) {

var start = 0;

var end = nums。length - 1;

var mid;

while(true){

mid = Math。floor((start + end) / 2);

if(nums[mid] > nums[start] && nums[mid] > nums[end]){

start = mid;

continue;

}

if(nums[mid] < nums[start] && nums[mid] < nums[end]){

end = mid;

continue;

}

return Math。min(nums[start], nums[end]);

}

};

這裡使用floor進行,當然也可以使用ceil,不做累述。實現方案應該都是大同小異。

下面進入第二題。存在重複數時的情況。

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

請找出其中最小的元素。

注意陣列中可能存在重複的元素。

示例 1:

輸入: [1,3,5]

輸出: 1

示例 2:

輸入: [2,2,2,0,1]

輸出: 0

連結:https://leetcode-cn。com/problems/find-minimum-in-rotated-sorted-array-ii

其實整體思路和第一題一樣,同樣使用二分法進行查詢,但是當出現相等的情況,需要考慮一下。

尤其是三個資料都相等的情況,這種最小值可能在兩邊的任意一箇中,不能直接確定,所以2塊都要繼續二分查詢下去。程式碼如下

/**

* @param {number[]} nums

* @return {number}

*/

var findMin = function(nums) {

var start = 0;

var end = nums。length - 1;

return findMinH(nums, start, end);

};

var findMinH = function(nums, start, end){

if(start + 1 >= end){

return Math。min(nums[start], nums[end]);

}

var middle = Math。floor((start + end) / 2);

if(nums[middle] == nums[start] && nums[middle] == nums[end]){

// 兩邊都需要繼續二分查詢

return Math。min(findMinH(nums, start, middle), findMinH(nums, middle + 1, end));

}

if(nums[middle] < nums[start] && nums[middle] < nums[end]){

end = middle;

return findMinH(nums, start, end);

}

if(nums[middle] > nums[start] && nums[middle] > nums[end]){

start = middle;

return findMinH(nums, start, end);

}

if(nums[middle] == nums[start] && nums[middle] > nums[end]){

start =middle;

return findMinH(nums, start, end);

}

if(nums[middle] == nums[end] && nums[middle] < nums[start]){

end =middle;

return findMinH(nums, start, end);

}

return Math。min(nums[start], nums[end]);

};

循序漸進,發現困難難度的題目也能憑自己直接想出解法。是比以前進步了很多。