您的位置:首页 > 其它

算法系列——Find Minimum in Rotated Sorted Array

2017-07-11 15:00 375 查看

算法描述

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.

You may assume no duplicate exists in the array.

题目含义:题中定义了一种新的排序数组形式,旋转数组,即把一个数组最开始的若干个元素搬到数组的末尾。例如:{0,1,2,4,5,6,7} 的一个旋转数组为{4,5,6,7,0,1,2},要求找到其中最小的一个元素。

解题思路:显示我们可以通过暴力解法来遍历找到这个最小值,时间复杂度为O(n),但是这样显然没有利用旋转数组的特点,并不是最优解法。在排序的数组中,我们可以利用二分查找法实现O(logn)的查找。

特别注意:

以下情况:

如果排序数组的前面的0个元素搬到后面,也是符合旋转数组的定义,因此要特别注意这种情况;

如果 首尾元素和中间元素值相同,这种情况下并不能确定最小值在哪个区间,所以需要顺序查找法特殊处理。

以下为Java 语言实现的算法。

public class Solution {
public int findMin(int[] nums) {
if(nums==null)
throw new IllegalArgumentException("Invalid parameter");

int index1=0;
int index2=nums.length-1;
int indexMid=index1;
while(nums[index1]>=nums[index2]){
if(index2-index1==1){
indexMid=index2;
break;
}
indexMid=(index1+index2)/2;
if(nums[index1]==nums[index2]&&nums[index1]==nums[indexMid])
return minOrder(nums,index1,index2);
if(nums[indexMid]>=nums[index1])
index1=indexMid;
else if(nums[indexMid]<=nums[index2])
index2=indexMid;
}
return nums[indexMid];
}

private int minOrder(int[] nums,int index1,int index2){

int result=nums[index1];
for(int i=index1+1;i<=index2;i++){
if(result>nums[i])
result=nums[i];
}
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: