题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。


package SwordOffer;

/** * @author jinhuajian * @data 2018年12月28日---下午2:18:10 * @blog https://me.csdn.net/qq_37119939 */
public class Solution_06 {

	// 跟左边的比,比不出来,脑子要活,mid跟右边界比
	public int minNumberInRotateArray_1(int[] array) {
		if (array == null || array.length < 1)
			return 0;
		int l = 0, r = array.length - 1;
		while (l < r) {
			int mid = l + (r - l) / 2;
			if (array[mid] > array[r]) {// 最小值肯定在mid的右边
				l = mid + 1;
			} else if (array[mid] < array[r]) {// 最小值肯定mid的左边或者就是mid;{4,5,1,2,3} array[mid]=1<array[r]=3
				r = mid;
			} else {// 出现这种情况的array类似 [1,0,1,1,1] 或者[1,1,1,0,1],此时最小数字不好判断在mid左边
				// 还是右边,这时只好一个一个试 ,
				r = r - 1;
			}
		}
		return array[l];
	}

	// {1,2,3,4,5,6,7}, {5,6,7,1,2,3,4}
	public static void main(String[] args) {
		Solution_06 s = new Solution_06();
		int[] arr = { 3, 4, 5, 1, 2 };
		int res = s.minNumberInRotateArray_1(arr);
		System.out.println(res);
	}
}

Python版

class Solution:
    def minNumberInRotateArray(self, arr):
        # write code here
        m = len(arr)
        if m == 0:
            return
        if m == 1:
            return arr[0]
        mid =l = 0
        r = m - 1

        while arr[l] >= arr[r]:
            if l == r-1:
                mid = r
                break
            #如果arr[0] = arr[r] = arr[mid],只能用从头到尾顺序查找顺序查找
            if arr [0] == arr[r] and arr[r] == arr[mid]:
                while l < r -1:
                    if arr[l] >= arr[0]:
                        l += 1
                    else:break
                return arr[l]

            mid = (l + r) // 2
            #if arr[mid] > arr[0]:
            if arr[mid] >= arr[l]:
                l = mid
            elif arr[mid] <= arr[r]:
                r = mid

        return arr[mid]