概述
题目: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 补充版本所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复