簡體   English   中英

這是 O(n^2) 運行時還是 O(n)?

[英]Is this a O(n^2) runtime or a O(n)?

我很困惑。 我在 leetcode 上解決了這個問題,我在嵌套 while 循環的地方編寫了這段代碼。 乍一看,人們會認為這是一個 O(N^2) 解決方案,但是,我想知道這是否屬實,因為內部 while 循環不會遍歷整個數組,而只是遍歷其中的一部分。 因此,我認為它是 O(N)。

請確認我的理解

 var removeDuplicates = function(nums) {
    let i = 0, j = i + 1
   
    while(i < nums.length - 1 && j < nums.length){
        while(nums[i] == nums[j]){
            nums.splice(j, 1)
        }

        j++
        i++
    }
    
    return j
};

這是O(n) 給定長度 L,外循環迭代 L 次(最壞情況),內循環也總共迭代 L 次(最壞情況,如果數組中的所有元素都是重復的)。

O(n) + O(n) = O(n)。

@CertainPerformance 已經做了繁重的工作來說服我們,當 nums 由所有重復項組成時, nums.splice(j, 1)的最壞情況最多運行 O(n) 次。

O(splice) = O(n) 每JavaScript 數組函數的運行時復雜度 這對我來說很有意義,最壞的情況是我們在 j = 2 處刪除 1 個元素意味着我們需要復制 n - 2 個元素,然后是 n - 3 個等。

O(removeDuplicates) = O(n^2)

您可以通過對列表進行排序使其成為 O(nlogn),然后遍歷排序列表並將當前值推送到結果列表(如果它與最后一個不同)。 O(n) 是如果您進行基數排序。

另請參閱在線性時間內從數組中刪除重復項,並且沒有額外的 arrays (注意,其中一些答案使用 O(n) 空間,因此它們不是該問題的有效答案)。

暫無
暫無

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

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