Leetcode- Search Insert Position

來源:互聯網
上載者:User

標籤:leetcode   折半尋找   順序尋找   c++   python   

演算法描述:

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You may assume no duplicates in the array.

Here are few examples.
[1,3,5,6], 5 → 2
[1,3,5,6], 2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6], 0 → 0

LeetCode連結:https://oj.leetcode.com/problems/search-insert-position/

演算法解析:

   本演算法要求:給定一個有序數組和目標值,能夠快速的找到目標值在該有序數組中的位置(即索引,注意數組的索引是從0開始的),而且這個數組可以認為是沒有重複數位。通過分析,我們知道,無論目標值在給定數組中是否存在,都要返回一個有效索引值,而且要保證將目標值插入後數組還是有序的。

   筆者喜歡一切從簡單入手,不行了在逐步往複雜的方面想,因此我首先想到的是順序尋找演算法,從前到後遍曆數組,直到找到位置結束。解決方案如下:

class Solution {public:    int searchInsert(int A[], int n, int target) {        int i = 0;        while((target > A[i]) && (i < n))        {            i++;        }        if (i == n)        {            return n;        }        else        {            return i;        }    }};
  
效能分析:    

   按照上面的解決方案,AC可以通過,結果如所示:

   從分析結果可以看出,該方案,測試了62個案例,總共運行了52ms,那對於該方法,還有沒有可以改進的地方呢!仔細分析一下,其實有些臨界點是不需要迴圈,比如:當目標值比數組中最小的值還小時(當然這種情況不影響效能,因為不會執行迴圈);當目標值比數組中最大的值還要大時,這種情況就會遍曆一遍數組。因此,只要我們對臨界條件分開處理,使迴圈提早結束,應該是可以改進效能的。改進後的解決方案如下:
class Solution {public:    int searchInsert(int A[], int n, int target) {        if (target <= A[0])        {            return 0;        }        else if (target == A[n - 1])        {            return n - 1;        }        else if (target > A[n - 1])        {            return n;        }        int i = 1;        while((target > A[i]) && (i < n))        {            i++;        }               return i;    }};


   AC分析結果如下:

   從結果可以看出,同樣是解析62個案例,時間縮短到了40ms,雖然說對於某一特定的案例效能未必提高,但是如果你的應用中需要大量的使用該演算法,那樣的話效能的提高還是極其可觀的。其他實現思路:

   其實本演算法就是對尋找演算法的應用,上面的方法是順序尋找演算法的應用,當然也可以使用折半尋找的思路來實現該演算法。解決方案如下:

class Solution {public:    int searchInsert(int A[], int n, int target) {        if (target <= A[0])     //目標比最小的數還小的情況        {            return 0;        }        else if (target > A[n - 1])     //目標比最大的數還大的情況        {            return n;        }        int low = 0;        int high = n;        int middle = (low + high) / 2;        while (low < high)        {            if (target == A[middle])    //找到了直接輸出,結束迴圈            {                return middle;            }            else if (target < A[middle])            {                high = middle - 1;            }            else            {                low = middle + 1;            }            middle = (low + high) / 2;        }                if (low == high)        //判斷迴圈結束條件:如果low!=high說明迴圈是因為找到了目標才退出,反之說明目標在數組中不存在        {            if (target > A[low])            {                return low + 1;            }            else            {                return low;            }        }    }};

   那麼折半尋找的效能如何呢,我們知道,順序尋找的時間複雜度是O(n),而折半尋找的時間複雜度為O(log2(n)),按理說折半尋找的效能應該比順序尋找要好的多,實際如何呢!我們看一下AC的結果吧,如下:

   從AC的結果,我們可以看出時間仍然是40ms,這是為什麼呢?因為,本演算法只是藉助於折半尋找的思路,而實際上尋找演算法是不要求數組有序的,而且折半尋找的效能是無序的情況下最高,當然還有其他因素,如AC中的案例的特徵等。

 Python解決方案:   順序尋找python解決方案如下:
class Solution:    # @param A, a list of integers    # @param target, an integer to be inserted    # @return integer    def searchInsert(self, A, target):        length = len(A)        if target > A[length - 1]:            return length;        elif target <= A[0]:            return 0;        i = 1;        while target > A[i]:            i += 1        return i        

   AC結果如下:
   python折半尋找對應實現方案:
class Solution:    # @param A, a list of integers    # @param target, an integer to be inserted    # @return integer    def searchInsert(self, A, target):        length = len(A)        if target > A[length - 1]:            return length        elif target <= A[0]:            return 0        low = 0        high = length        middle = (low + high) / 2                while low < high:            if target == A[middle]:                return middle            elif target > A[middle]:                low = middle + 1            else:                high = middle            middle = (low + high) / 2                    if low == high:            if target > A[low]:                return low + 1            else:                return low


   AC結果如下:

   這裡,筆者只給出結果,大家分析一下,會有驚喜發現啊!!!

Leetcode- Search Insert Position

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.