【劍指offer】-旋轉數組的最小數字-06/67

一 題目描述

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。
輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。
例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。
NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。

二 題目分析

  1. 該數組原來是一個單調遞增的數組,將前n個數字旋轉到後面,輸出最小的數字,假如數組大小爲0的話,則返回0。
  2. 直接遍歷循環輸出最小的,這樣的方法是最暴力的(不提倡)
  3. 借鑑二分法的思維方式
數組: 3 4 5     1 2 3
      ---1---   ---2---
1. 原數組旋轉後,必然是兩個有序的遞增序列
2. 假如當前中間的元素小於最右面的元素,則證明現在處於2位置 left = mid + 1
3. 假如當前中間的元素大於最右面的元素,則證明現在處於1位置 right = mid
4. 假如當前中間的元素等於最右面的元素,則證明元素中出現了重複的,這時候需要挨個判斷,直接right--

三 代碼(Java)

import java.util.ArrayList;
public class Solution {
  public int minNumberInRotateArray(int[] array) {
		int len = array.length;
		if (len == 0) {
			return 0;
		} else {
			int left = 0;
			int right = len - 1;
			while (left < right) {
				int mid = (left + right) / 2;
				if (array[mid] < array[right]) {
					right = mid;
				} else if (array[mid] > array[right]) {
					left = mid + 1;
				}else {
					right--;
				}
			}
			return array[left];
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章