[英]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
需要三個迭代:
並以非遞減順序返回一個可迭代的正方形。
(理想情況下,我們可以在跳出循環之前將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.