我是靠谱客的博主 娇气长颈鹿,最近开发中收集的这篇文章主要介绍旋转数组的最小数字 leetcode 补充版本,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:https://blog.csdn.net/nsjlive/article/details/87652925

在leetcode中,几个测试例子:indexMid=2; 说明又重复值的情况下,https://blog.csdn.net/nsjlive/article/details/87652925的解答在数组存在重复元素的情况下失效

if(array[indexMid]>=array[low]){
                low=indexMid;       //反例:[10,1,10,10,10]  ,找不到最小值

else if(array[indexMid]<=array[high]){
                high=indexMid;
            }  //反例:[2,2,2,0,2]    根本找不到最小值

 

参考leetcode :

Find Minimum in Rotated Sorted Array II (154,Hard)    该数组可能包含重复项。

153. Find Minimum in Rotated Sorted Array (mediun)   您可以假设数组中不存在重复。

 

好的解法,自然是考虑数组中可能包含重复项。 

定义:旋转数组前,Minimum是数组的第一个元素。

数组旋转前,前半部分为part1,后半部分为part2,显然part1<=part2;

数组旋转后,part2在前,part1在后。 

分析:

1)   if(nums[mid] > nums[high])     //[2,2,2,0,1]  

nums[high]]属于part1 最小值也在part1   假设 nums[mid]属于part1,则nums[mid] <=nums[high] 
假设不成立, 说明nums[mid]一定属于part2, 而Minimum在part1  ,继续往后面查找即可 ; low = mid + 1; 

2)   if(nums[mid] == nums[high])   // 例如  [10,1,10,10,10] 

不能判断  nums[mid]属于part1还是属于part2,但可以确定的是,nums[mid]出现了多次,题目要求寻找最小的数,如果nums[mid]==Minimum ,出现多次,可以舍掉最后一个,继续查找  high = high - 1   ;

3) if(nums[mid] < nums[high])   

 说明nums[mid]一定属于part1,往前面查找即可。   high = mid;   

例如  [10,1,1,10,10] 

public int findMin(int[] nums) {
int low = 0 ;
int high =nums.length - 1;
while(low < high){
int mid = low + (high - low) / 2;
if(nums[mid] > nums[high]){//说明nums[mid]一定属于part2,继续往后面查找即可
low = mid + 1;
}else if(nums[mid] == nums[high]){
high = high - 1;//说明该数字出现多次,舍弃掉最后一个,继续查找
}else{//说明nums[mid]属于part1
high = mid;
}
}
return nums[low];
}

 

最后

以上就是娇气长颈鹿为你收集整理的旋转数组的最小数字 leetcode 补充版本的全部内容,希望文章能够帮你解决旋转数组的最小数字 leetcode 补充版本所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部