「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]);

};

循序渐进,发现困难难度的题目也能凭自己直接想出解法。是比以前进步了很多。


分享到:


相關文章: