嗨,我正在做 DSA 問題,發現了一個問題,稱為排序陣列中元素的上限。在這個問題中有一個排序陣列,如果目標元素存在于排序陣列中,則回傳目標。如果在排序陣列中找不到目標元素,我們需要回傳大于目標的最小元素。我已經撰寫了代碼并做了一些測驗用例,但需要檢查一切是否正常。這個問題在 leetcode 上不存在,我可以在許多不同的情況下運行它。如果問題以正確的方式解決并且在所有情況下都能給出正確的結果,則需要建議/反饋
class Solution:
#My approch
def smallestNumberGreaterThanTarget(self, nums, target):
start = 0
end = len(nums)-1
if target > nums[end]:
return -1
while start <= end:
mid = start (end-start)//2
if nums[mid] == target:
return nums[mid]
elif nums[mid] < target:
if nums[mid 1] >= target:
return nums[mid 1]
start = mid 1
else:
end = mid-1
return nums[start]
uj5u.com熱心網友回復:
對于空串列,代碼會因索引超出范圍錯誤而出錯(盡管這可能不是必需的,因為您尚未指定問題約束)。
if函式頂部的一個簡單的守衛可以解決這個問題:
if not nums:
return -1
否則,對我來說似乎很好。但是,如果您仍然不確定您的演算法是否有效,您可以隨時進行隨機測驗(例如,創建演算法的線性搜索版本,然后隨機生成兩種演算法的輸入,然后查看是否有任何差異)。
這是您可以測驗的單行:
input_list = [0, 1, 2, 3, 4]
target = 0
print(next((num for num in input_list if num >= target), -1))
uj5u.com熱心網友回復:
IMO,這個問題可以用一種更簡單的方式解決,在主回圈中只有一個測驗。下圖顯示了實線的一個磁區,以與陣列中的值相關聯的子集中。

首先,我們注意到對于最大值之上的所有值,都沒有對應的元素,我們將單獨處理這種情況。
現在我們只剩下 N 個子集,我們可以通過對這些子集進行二分搜索來找到正確的一個。
if target > nums[len(nums)-1]:
return None
s, e= 0, len(nums);
while e > s:
m= e ((s - e) >> 1);
if target > nums[m]:
s= m 1
else:
e= m
return s
我們可以使用不變數nums[s-1] < target <= nums[e]和虛構的約定來正式證明演算法nums[-1] = -∞。最后,我們有了括號nums[s-1] < target <= nums[s]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/400687.html
上一篇:乘法后計算溢位位的有效方法
