面試題八 旋轉數組的最小數字

題目:

輸入一個按遞增排序數組的一個旋轉,輸出該數組的最小數字。

輸入:

12345的旋轉可以是34512,所以我們輸入34512.

輸出:

1

解題思路:

較爲直觀的方法是每一個數據都掃描一遍,找到最小的元素,這樣的時間複雜度爲0(N),但是可以 利用2分法,用兩個指針分別指向數組的第一個元素和最後一個元素,接着我們找到指針之間的中間元素,通過判斷中間元素是大於第一個指針來判斷是在第一個數組之中,還是在第二個數組之中,然後不斷的縮小範圍,當兩個指針相差爲1時,第二個指針,恰好指向最小元素。當然也有例外情況,比如(1,0,1,1,1)是(0,1,1,1,1,1)的旋轉,他們的中間元素和第一個指針與第二個指針都相同,這樣我們很難判斷他是第一個數組還是第二個數組,這種情況下,我們只能採用順序查找。

Java代碼實現:

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] arr={3,4,5,1,2};
		// TODO Auto-generated method stub
		System.out.println(min(arr));
		

	}
	
	//輸出旋轉數組的最小元素
	public static  int  min(int arr[]){
		int index1=0;
		int index2=arr.length-1;
		int mid=index1;
		
		if(arr==null && arr.length<=0){
			return 0;
		}
		while(arr[index1]>=arr[index2]){
			if(arr[index1]==arr[index2] && arr[mid]==arr[index1])
			{
				int min=arr[index1];
				for(int i=index1+1;i<=index2;i++){
					if(arr[i]<min){
						min=arr[i];
					}
					return min;
				}
			}
		if(index2-index1==1){
			mid=index2;
			break;
		}
		//用位運算代替除法,可以節省效率
		mid=(index1+index2)>>1;
		if(arr[mid]>=arr[index1]){
			index1=mid;
		}else if(arr[mid]<=arr[index2]){
			index2=mid;
		}
		
		}
		return arr[mid];
		
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章