字符串算法——查找有序数组旋转后最小值(有重复元素)(Find Minimum in Rotated Sorted Array II)
2017-10-14 09:21
766 查看
问题:
Follow up for “Find Minimum in Rotated Sorted Array”:
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
The array may contain duplicates.
思路一:同无重复元素数组一样,采用最简单的直接遍历,依次比较,不过这里时间复杂度不满足条件。
思路二:同无重复元素数组一样,可以采用二分查找的算法,但由于存在重复元素,所以无法确定最小值是落在中间索引的哪一侧,对两侧分别查找,比较两侧查找的最小值。
Follow up for “Find Minimum in Rotated Sorted Array”:
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
The array may contain duplicates.
思路一:同无重复元素数组一样,采用最简单的直接遍历,依次比较,不过这里时间复杂度不满足条件。
class Solution { public int findMin(int[] nums) { int len = nums.length; int minIndex = 0; for(int i = 1;i<len;i++){ if(nums[minIndex]>nums[i]){ minIndex = i; } } return nums[minIndex]; } }
思路二:同无重复元素数组一样,可以采用二分查找的算法,但由于存在重复元素,所以无法确定最小值是落在中间索引的哪一侧,对两侧分别查找,比较两侧查找的最小值。
class Solution { public int findMin(int[] nums) { int len = nums.length; return dfs(nums,0,len-1); } private int dfs(int[]nums,int min,int max){ if(min==max){ return nums[min]; } int mid = (min+max)/2;//中间索引值 int left = Integer.MAX_VALUE; int right = Integer.MAX_VALUE; if(nums[mid]>=nums[max]){ left = dfs(nums,mid+1,max);//可能落在右侧 } if(nums[mid]<=nums[max]){//可能落在左侧 right = dfs(nums,min,mid); } return Math.min(left,right);//比较两侧查找出的值 } }
相关文章推荐
- 字符串算法——查找有序数组旋转后的最小值(无重复元素)(Find Minimum in Rotated Sorted Array)
- LeetCode OJ 之 Find Minimum in Rotated Sorted Array II(查找旋转有序数组中的最小值 - 二)
- 字符串算法——旋转数组中查找目标值(有重复元素)( Search in Rotated Sorted Array II)
- Find Minimum in Rotated Sorted Array II 旋转数组中找最小值(有重复元素) @LeetCode
- [LeetCode] Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二
- 【LeetCode-面试算法经典-Java实现】【154-Find Minimum in Rotated Sorted Array II(找旋转数组中的最小数字II)】
- LeetCode-Find Minimum in Rotated Sorted Array II-旋转排序数组找最小-二分查找
- 154.leetcode Find Minimum in Rotated Sorted Array II(hard)[排序数组 重复元素 二分查找]
- Find Minimum in Rotated Sorted Array 2 寻找旋转有序数组的最小值之二
- 【LeetCode-面试算法经典-Java实现】【153-Find Minimum in Rotated Sorted Array(找旋转数组中的最小数字)】
- [Java语言] [Leetcode] Find Minimum in Rotated Sorted Array 找旋转有序数组的最小值
- LeetCode OJ 之 Find Minimum in Rotated Sorted Array (查找旋转有序数组中的最小值)
- Find Minimum in Rotated Sorted Array 循环数组中查找最小的数
- Find Minimum in Rotated Sorted Array 旋转数组中找最小值 @LeetCode
- Search in Rotated Sorted Array II 旋转数组二分查找 有重复
- 【LeetCode】Find Minimum in Rotated Sorted Array 在旋转数组中找最小数
- leetcode 7. 在有序可重复数组旋转后搜索 Search in Rotated Sorted Array II
- Search in Rotated Sorted Array II 旋转数组(有重复元素)里找数@LeetCode
- Find Minimum in Rotated Sorted Array(旋转数组的最小数字)
- 153.leetcode Find Minimum in Rotated Sorted Array(medium)[有序数组 二分查找]