[LeetCode][Java] Search in Rotated Sorted Array II

來源:互聯網
上載者:User

標籤:leetcode   java   search in rotated so   

題目:

Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

題意:

伴隨著問題《Search in Rotated Sorted Array》:

如果重複元素是被允許的呢?

寫出一個函數判定目標值是否在數組中。


演算法分析:

這種問題我開始就是直接從頭到尾遍曆一遍,這樣不就把目標元素找出來了麼,開始我認為這個不就這麼簡單麼。

可是這樣的時間複雜度為O(n),雖然同樣能AC,但是不是我們追求的演算法哈。

參考http://blog.csdn.net/linhuanmars/article/details/20588511 

這道題是二分尋找Search Insert Position的變體,思路在Search in Rotated Sorted Array中介紹過了,不瞭解的朋友可以先看看那道題哈。和Search in Rotated Sorted Array唯一的區別是這道題目中元素會有重複的情況出現。不過正是因為這個條件的出現,出現了比較複雜的case,甚至影響到了演算法的時間複雜度。原來我們是依靠中間和邊緣元素的大小關係,來判斷哪一半是不受rotate影響,仍然有序的。而現在因為重複的出現,如果我們遇到中間和邊緣相等的情況,我們就丟失了哪邊有序的資訊,因為哪邊都有可能是有序的結果。假設原數組是{1,2,3,3,3,3,3},那麼旋轉之後有可能是{3,3,3,3,3,1,2},或者{3,1,2,3,3,3,3},這樣的我們判斷左邊緣和中心的時候都是3,如果我們要尋找1或者2,我們並不知道應該跳向哪一半。解決的辦法只能是對邊緣移動一步,直到邊緣和中間不在相等或者相遇,這就導致了會有不能切去一半的可能。所以最壞情況(比如全部都是一個元素,或者只有一個元素不同於其他元素,而他就在最後一個)就會出現每次移動一步,總共是n步,演算法的時間複雜度變成O(n)。


AC代碼:

<span style="font-family:Microsoft YaHei;font-size:12px;">public boolean search(int[] A, int target) {    if(A==null || A.length==0)        return false;    int l = 0;    int r = A.length-1;    while(l<=r)    {        int m = (l+r)/2;        if(A[m]==target)            return true;        if(A[m]>A[l])        {            if(A[m]>target && A[l]<=target)            {                r = m-1;            }            else            {                l = m+1;            }        }        else if(A[m]<A[l])        {            if(A[m]<target && A[r]>=target)            {                l = m+1;            }            else            {                r = m-1;            }                        }        else        {            l++;        }    }    return false;}</span>


著作權聲明:本文為博主原創文章,轉載註明出處

[LeetCode][Java] Search in Rotated Sorted Array II

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.