天天看點

Java_劍指offer11~旋轉數組的最小數字TheMinInRotatedArray

TheMinInRotatedArray

Description

把一個數組最開始的若幹個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個遞增排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如,數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1.

Solution

從頭到尾周遊一下,時間複雜度為O(n),直覺的解法并不是題目的本意。

下面是解析過程

Java_劍指offer11~旋轉數組的最小數字TheMinInRotatedArray

Code

public class MinNumInRotatedArray {
	 public static int min(int[] data){
	        if(data==null || data.length==0)
	            return -1;
	        int left = 0;
	        int right = data.length-1;
	        int mid;
	        while(left<right){
	            mid = left+(right-left)/2;
	            //left < right
	            if(data[left]<data[right])
	                return data[left];
	            //left > right
	            else if(data[left]>data[right]){
	                if(data[mid]>=data[left])
	                    left = mid + 1;
	                else
	                    right = mid;
	            }
	            //left = right
	            else{
	                if(data[left]<data[mid])
	                    left = mid + 1;
	                else if(data[left]>data[mid])
	                    right = mid;
	                else{
	                    left = left+1;
	                    right = right-1;
	                }
	            }
	        }
	        return data[right];
	    }
	    public static void main(String[] args){
	        int[] data1 = {3,4,5,1,2};
	        int[] data2 = {1,0,1,1,1};
	        int[] data3 = {1,1,1,0,1};
	        System.out.println(min(data1));
	        System.out.println(min(data2));
	        System.out.println(min(data3));
	    }
	}

           

Appendix

1.這道題目還不是太熟練,後續還得再看一遍才行