1. 程式人生 > >劍指offer_陣列---旋轉陣列的最小數字

劍指offer_陣列---旋轉陣列的最小數字

題目描述

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

解題思路

1,使用Arrays.sort
2,暴力遍歷法
3,二分查詢

程式碼實現

package 陣列;

import java.util.Arrays;


public class MinNumberInRotateArray {

    public static void main(String[] args) {
        int
[] array = { 1,1,1,0,1 }; System.out.println(new MinNumberInRotateArray() .minNumberInRotateArraySuperFind(array)); } // =========================================================非技巧解法利用Arrays的sort函式,直接排序O(nlogn) public int minNumberInRotateArray(int[] array) { if
(array==null||array.length<1){ throw new RuntimeException("陣列不合法"); } Arrays.sort(array); return array[0]; } // ==========================================================技巧解法,暴力遍歷法O(n) public int minNumberInRotateArraySuper(int[] array) { if(array
==null||array.length<1){ throw new RuntimeException("陣列不合法"); } int i = 0; for (; i < array.length; i++) { if (array[i] > array[i + 1]) { break; } } return array[i + 1]; } // ==========================================================技巧解法,二分查詢法O(logn) public int minNumberInRotateArraySuperFind(int[] array) { if(array==null||array.length<1){ throw new RuntimeException("陣列不合法"); } int low = 0; int high = array.length-1; int middle =0; while(low<high){ middle = (high+low)/2; if(array[middle]>array[high]){ //middle在左邊遞增區間 low = middle+1; //最小值在middle右邊 }else if(array[middle]==array[high]){ //1,1,1,0,1這樣沒有辦法只能順序遍歷 Arrays.sort(array); return array[0]; } else{ high = middle; //middle在右邊遞增區間,最小值在middle或者middle左邊 } } return array[low]; } }