劍指Offer的學習筆記(C#篇)-- 旋轉數組的最小數字

題目描述

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

一 . 方法分析(正常單調遞增數組)

        1 . 參考二分查找法,咱們用兩個指針分別指向數組的第一個元素和最後一個元素。數組

  2 . 基於二分查找法的概念,找到數組中間的元素:由於該題目是查找旋轉數組中的最小值。spa

            若是該中間元素位於前面的遞增子數組,那麼它應該大於或者等於第一個指針指向的元素。此時數組中最小的元素應該位於該中間元素的後面。咱們能夠把第一個指針指向該中間元素,這樣能夠縮小尋找的範圍。移動以後的第一個指針仍然位於前面的遞增子數組之中。指針

            若是中間元素位於後面的遞增子數組,那麼它應該小於或者等於第二個指針指向的元素。此時該數組中最小的元素應該位於該中間元素的前面。code

  3 . 接下來咱們再用更新以後的兩個指針,重複作新一輪的查找。blog

可參考下例:排序

        1. 肯定Pmid爲5,Pmid>P1且Pmid>P2,說明P1到Pmid爲單增。it

        2. 把Pmid定義爲P1,新的Pmid爲1,這時候Pmid<P1且Pmid<P2,說明Pmid到 P2是單增,把新的Pmid定義爲P2。io

        3. 這時候P1>P2,且位置相差爲1,結束,得出最小數爲P2。class

二 . 特殊條件

        1 . 魯棒判斷:即數組長度爲0或者爲空數組時,應返回0.方法

        2 . 存在相等的數。

        例:

         1. 有重複數字,而且重複的數字恰好的最小的數字。    { 3, 4, 5, 1, 1, 2 }

         2. 有重複數字,但重複的數字不是第一個數字和最後一個數字。   { 3, 4, 5, 1, 2, 2 }

         3. 單調升序數組,旋轉0個元素,也就是單調升序數組自己。{ 1, 0, 1, 1, 1 }

         4. 數組中只有一個數字。{ 1 }

        適當的採用順序查找法。太晚了,明天寫吧!!

三 . 代碼實現

class Solution
{
    public int minNumberInRotateArray(int[] rotateArray)
    {
        // write code here
        //魯棒判斷
        if(rotateArray == null || rotateArray.Length <= 0)
        {
            return 0;
        }
        //定義三個參數,用於後期的指針
        int a = 0;
        int b = rotateArray.Length - 1;
        int mid = 0;
        //while終止條件(每次前者大於後者的時候均要對比,當兩者差一個數據位時終止返回)
        while(rotateArray[a]>=rotateArray[b])
        {
            if(b - a == 1)
            {
                mid = b;
                break;
            }
        //二分查找法,對mid參數的修改
        mid = (b+a)/2;
        //特殊狀況,特殊對待(即數列中存在相等參數時,就採用順序查找法)
        if(rotateArray[a] == rotateArray[mid] && rotateArray[mid] == rotateArray[b])
        {
            int min = rotateArray[a];
            for(int i = 0;i<rotateArray.Length-1;i++)
            {
                if(min<rotateArray[i])
                {
                    min = rotateArray[i];
                }
            }
        }
        //二分查找法,先後指針的修改
        if(rotateArray[mid]>=rotateArray[a])
        {
            a = mid;
        }
        if(rotateArray[mid]<=rotateArray[b])
        {
            b = mid;
        }
        }
        //返回最小值
        return rotateArray[mid];
    }
}
相關文章
相關標籤/搜索