您的位置:首页 > 其它

leetcode练习

2014-10-19 22:08 211 查看
//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.

//You may assume no duplicate exists in the array.
public class One {
	public int findMin(int[] num) {
		int i=0;
		int j=num.length-1;
		int mid=0;
		if(num.length==1||num[i]<num[j]) return num[0];
		else{
			while(i+1!=j){
				mid=(i+j)/2;
				if(num[i]<num[mid]) {
					i=mid;
				}
				if(num[i]>num[mid]){
					j=mid;
				}
			}
			return num[j];
		}
        
    }
	public static void main(String[] args) {
		One one=new One();
		int[] num={6,7,8,9,1,2,3,4};
		int a=one.findMin(num);
		System.out.println(a);
	}
}

此题目的必然不是暴力遍历,要考虑三种情况:

1)数组里只有一个数的时候,此时谈不上以轴反转,直接输出即可。

2)数组没有以轴翻转,此时直接输出第一个数即可。

3)数组以某一项为轴翻转例:

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2)
思路:翻转之后其实变为两个有序数组,顺序都是从小到大,可以借鉴二分查找的思路。首先定义三个下标,分别为i=0(最左边的下标),j=num.length-1(最右边的下标,因为数组下标从0开始),中间数字的下标mid=(i+j)/2。
接下来就是模拟二分查找的过程:翻转过后,这组数字就变成了两个递增数组,且最小的数在第二个递增数组内,如果num[i]<num[mid],则说明左边的递增数组还未结束,呢最小的必然在右半部分,于是我们抛弃左边的所有数,抛弃方法就是令下标i=mid,j不变,并且重新计算mid;
如果是num[i]>num[mid],说明中间的数字已经在右边的递增数组里了,说明最小的在左半部分,于是我们抛弃右边所有的数,抛弃方法令j=mid,i不变,重新计算mid;
直到最后输出的num[j](因为在此迭代过程中我么不断抛弃的是有序的递增数组,则剩下的两个数就不是递增的,所有num[j]是最小的)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: