Find Minimum in Rotated Sorted Array II

来源:互联网 发布:淘宝买水烟被警察 编辑:程序博客网 时间:2024/06/06 14:52

Find Minimum in Rotated Sorted Array II


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 a sorted array 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.


问题

“选择有序数组最小值”问题延伸:允许数组中有重复值。

这会影响时间复杂度吗?如何影响?为什么?

假设一个有序数组在某个未知中心旋转(如0 1 2 4 5 6 7可能变成4 5 6 7 0 1 2),找到数组中最小的元素。

数组中可能包含重复的元素。


思路

解题思路课参照Find Minimum in Rotated Sorted Array,当允许重复值时,不同之处是:
1. left == right时,无法判断是三种情况中的哪种,此时采用遍历方式。
2. left != right时,当left <= mid时,最小值在右边;当mid <= right时,最小值在左边。


代码(Java)

ublic class Solution {    public int findMin(int[] nums) {        return binarySearch(nums,0,nums.length-1);    }    public int binarySearch(int[] nums, int left , int right) {        int length = right - left;        if (length == 0) return nums[left];        if (length == 1) return (nums[left] > nums[right] ? nums[right] : nums[left]);        else {            if (nums[left] < nums[right]){                return nums[left];            } else if(nums[left] > nums[right]){                int mid = (left + right)/2;                if (nums[left] < nums[right]){                    return nums[left];                } else if (nums[0] <= nums[mid] ){                    return binarySearch(nums,mid,right);                } else {                    return binarySearch(nums,left,mid);                }            } else {                for(int i = 1;i<nums.length;i++){                    if(nums[i] < nums[i-1]){                        return nums[i];                    }                }                return nums[0];            }        }    }}

运行结果

这里写图片描述

0 0
原创粉丝点击