《剑指offer》面试题8:旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素的位置。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。

思路:采用二分查找O(logn)比顺序遍历O(n)快。需要考虑相等数字的特殊情况,此时只能顺序遍历。

public int minNumReversing(int[] nums) {
	if (nums.length <= 1)
		return nums.length-1;
	int s=0, e=nums.length-1;
	while (e - s > 1) {
		int mid = s + (e - s) / 2;
		if (nums[mid] < nums[mid-1])
			return mid;
		else if (nums[mid] > nums[mid-1])
			e = mid - 1;
		else if (nums[mid] == nums[s] || nums[mid] == nums[e]) {
			int i=1;
			while (i < nums.length && nums[i] >= nums[i-1]) {
				i++;
			}
			return i;
		}
	}
	return nums[s]>nums[e] ? e : s;
}

猜你喜欢

转载自blog.csdn.net/qq_25024883/article/details/79436830
今日推荐