簡體   English   中英

這個算法的時間復雜度寫在下面

[英]time complexity of this algorithm written below

根據我的計算,這個算法/代碼的時間復雜度是O(logN),因為它是對二分查找的增強,但是在leetcode和其他平台提交代碼時,據說超過了時間限制。 他們還期望該算法的時間復雜度為 O(logN),所以請確認下面編寫的代碼的復雜度是 O(logN) 還是與此不同?

class Solution {
public:
    int findLast(vector<int> arr, int n, int x)
    {
        int l = 0;
        int h = n - 1;
        int mid;
        while (h >= l) {
            mid = (l + h) / 2;
            if (arr[mid] == x) {
                if (arr[mid + 1] != x) {
                    return mid;
                }
                else {
                    l = mid + 1;
                }
            }
            else if (arr[mid] > x) {
                h = mid;
            }
            else if (arr[mid] < x) {
                l = mid + 1;
            }
        }
        return -1;
    }

    int findFirst(vector<int> arr, int n, int x)
    {
        int l = 0;
        int h = n - 1;
        int mid;
        while (h >= l) {
            mid = (l + h) / 2;
            if (arr[mid] == x) {
                if (arr[mid - 1] != x) {
                    return mid;
                }
                else {
                    h = mid;
                }
            }
            else if (arr[mid] > x) {
                h = mid;
            }
            else if (arr[mid] < x) {
                l = mid + 1;
            }
        }
        return -1;
    }

    vector<int> searchRange(vector<int>& nums, int target)
    {
        int last = findLast(nums, nums.size(), target);
        int first = findFirst(nums, nums.size(), target);
        vector<int> v1 = { first, last };
        return v1;
    }
};

您的代碼的時間復雜度為 O(∞),因為它可以執行無限循環。

考慮一下在單元素向量上運行findLast時會發生什么。 你將得到hlmid等於 0。如果你進入arr[mid] > x分支,那么你運行h = mid; 它使變量保持不變,並無限期地重復。

除此之外,您應該通過引用獲取vector參數以避免復制,這會使它成為線性運行時。

您的代碼無法處理輸入可能為[1,1]且目標為1的某些極端情況。 findLast中, low變量和high變量將變為1 ,當您檢查arr[mid+1]時會發生分段錯誤。 對於findFirst ,同樣的解釋也是 go。 試試這個,看看它是否有幫助:

int findLast(vector<int> arr, int n, int x)
{
    int l = 0;
    int h = n - 1;
    int mid;
    while (h > l)
    {
        mid = (l + h) / 2;
        if (arr[mid] == x)
        {
            if (arr[mid + 1] != x)
            {
                return mid;
            }
            else
            {
                l = mid + 1;
            }
        }
        else if (arr[mid] > x)
        {
            h = mid;
        }
        else if (arr[mid] < x)
        {
            l = mid + 1;
        }
    }
    return arr[l] == x ? l : -1;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM