LeetCode 154 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.

思路1:採用排序(jdk中的快排),时间复杂度为O(nlogn)。代码例如以下
public class Solution {
	public int findMin(int[] num) {
		Arrays.sort(num);
		return num[0];
	}
}

思路2:採用一次性遍历。时间复杂度为O(n)。代码例如以下
public class Solution {
    public int findMin(int[] num) {
        int  min=Integer.MAX_VALUE;
        for(int i=0;i<num.length;i++){
        	if(min>num[i])
        		min=num[i];
        }
        return min;
    }
}
思路3:採用折半查找,时间复杂度为O(logn),代码例如以下
public class Solution {
	public int findMin(int[] num) {
		return minFind(num, 0, num.length - 1);
	}

	private int minFind(int[] num, int begin, int end) {
		int middle = (begin + end) / 2;
		if (begin == end) {
			return num[begin];
		} else if (end == begin + 1) {
			return Math.min(num[begin], num[end]);
		} else if (end == begin + 2) {
			return Math.min(Math.min(num[begin], num[begin + 1]), num[end]);
		}
		if (num[begin] == num[end]) {
			return Math.min(minFind(num, begin, middle),minFind(num, middle, end));
		}
		if (num[middle] < num[begin] && num[middle] <= num[end]) {
			return minFind(num, begin, middle);
		} else if (num[begin] <= num[middle] && num[end] < num[middle]) {
			return minFind(num, middle, end);
		} else if (num[begin] < num[middle] && num[middle] <= num[end]) {
			return minFind(num, begin, middle);
		}else if (num[begin] <= num[middle] && num[middle] < num[end]) {
			return minFind(num, begin, middle);
		}
		return 0;
	}
}


版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/bhlsheji/p/4721602.html