1. 程式人生 > >6.5 旋轉陣列的最小數字(二分法:python,java實現)

6.5 旋轉陣列的最小數字(二分法:python,java實現)

題目:把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。

例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。

二分法查詢:

python版本:

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        length = len(rotateArray)
        if length == 0:
            return 0
        if length == 1:
            return rotateArray[0]

        left, right = 0, length- 1
         
        while left<= right:
            mid = (left+ right) >> 1
            if rotateArray[mid] > rotateArray[right]:
                left = mid+ 1
            elif rotateArray[mid] < rotateArray[right]:
                right = mid
            else:
                right -= 1
            if left >= right:
                break
        return rotateArray[left]

java版本:
import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int len=array.length;
        int left=0;
        int right=len-1;
        if(len==0){
            return 0;
        }
        if(len==1){
            return array[0];
        }
        else{
            while(left<=right){
                int mid = (left+ right) >> 1;
            	if (array[mid] > array[right]){
                    left = mid+ 1;
                }                
                else if (array[mid] < array[right]){
                    right = mid;
                }
                else{
                    right -= 1;
                }                
                if (left >= right)
                	break;            
            }
            return array[left];
        }
    }
}

C#:從頭遍歷整個陣列,找出最小的數,時間複雜度為O(n);

class Solution
{
    public int minNumberInRotateArray(int[] rotateArray)
    {
        // write code here
        while (rotateArray.Length ==0)
                return 0;
 
        //number存取旋轉陣列中的最小值,初始值為陣列第一個數
        int number = rotateArray[0]; ;
        for (int i = 1; i <= rotateArray.Length - 1; i++)
        {
            if (number >= rotateArray[i])
            {
                number = rotateArray[i];
            }
        }
        return number;
    }