簡體   English   中英

如何以非遞減順序 O(N) 時間復雜度對已排序的數組進行排序?

[英]How to sort an already sorted array in non-decreasing order O(N) time complexity?

問題:

給定一個非遞減順序的排序數組,返回每個數字的平方數組,也是非遞減順序。 例如:[-4,-2,-1,0,3,5] -> [0,1,4,9,16,25]

我正在嘗試兩點方法。 比較兩個極值的絕對值,然后將其添加到新列表中。 這是代碼:

def make_square(arr):
    if arr == []:
        return Null
    left = 0
    right = len(arr)-1
    result = len(arr) * [None]
    result_ind = len(result)-1

    while left < right:
        if abs(arr[left]) > abs(arr[right]):
            result[result_ind] = (arr[left])**2
            left +=1
        else:
            result[result_ind] = (arr[right])**2
            right -=1
        result_ind -=1
    return result

make_square([-4,-2,-1,0,3,5])

但是,我得到以下結果:

[無、1、4、9、16、25]

我怎樣才能解決這個問題?

def make_square(arr):
if arr == []:
    return Null
left = 0
right = len(arr)-1
result = len(arr) * [None]
print(result)
result_ind = len(result)-1

while left <= right:           #You missed the starting case where left is equal to right
    if abs(arr[left]) > abs(arr[right]):
        result[result_ind] = (arr[left])**2
        left +=1
    else:
        result[result_ind] = (arr[right])**2
        right -=1
    result_ind -=1
return result

make_square([-4,-2,-1,0,3,5])

使用 Python 中的一些較少使用的功能可以使這變得非常簡短:用於迭代輸入、雙端隊列和heapq.merge的顯式list_iterator

from heapq import merge
from collections import deque


def make_square(arr):
    itr = iter(arr)
    neg = deque()
    for x in itr:
        if x >= 0:
            break
        neg.appendleft(x**2)

    return list(merge(neg, [x**2], (x**2 for x in itr)))

我們只使用for循環,並重復進行符號檢查,直到我們看到第一個非負值。 在我們這樣做之前,我們將每個輸入值的平方添加到一個雙端隊列中,以保持平方不遞減。 (添加到列表的效率要低得多。)

merge需要三個迭代:

  • 負值的預先計算的平方,按非遞減順序
  • singleton 列表包含第一個非負輸入值的平方
  • 生成輸入值的 rest 平方的生成器

並以非遞減順序返回一個可迭代的正方形。

(理想情況下,我們可以在跳出循環之前將x推回itr ,但我們不能,而且解決方法並不比簡單地將第三個參數傳遞給merge更干凈。)

你可以簡單地這樣做:

def make_square(arr):
    return sorted([a**2 for a in arr])

print(make_square([-4,-2,-1,0,3,5]))

Output:

[0, 1, 4, 9, 16, 25]

暫無
暫無

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

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