兩數之和問題:給定乙個列表和乙個整數,從列表中找到兩個數,使得兩數之和等於給定的數,返回兩個數的下標。題目保證有且只有一組解
def two_sum_1(nums, target):
"""時間複雜度:o(n*n)
:param nums:
:param target:
:return:
"""n = len(nums)
for i in range(n - 1):
n1 = nums[i]
for j in range(i + 1, n):
n2 = nums[j]
if n1 + n2 == target:
return i, j
def two_sum_2(nums, target):
"""時間複雜度:o(n*k),k為python查詢某個元素是否在列表內的時間複雜度
:param nums:
:param target:
:return:
"""for n1 in nums:
n2 = target - n1
if n2 in nums: # 判斷n2是否在列表內
if n1 != n2:
return nums.index(n1), nums.index(n2)
else: # n1和n2重複
return nums.index(n1), nums.index(n2, nums.index(n1) + 1)
def search(li, val):
"""二分查詢方法
:param li:
:param val:
:return:
"""left = 0
right = len(li) - 1
while left <= right:
mid = (left + right) // 2
if val == li[mid][0]:
return mid
elif val > li[mid][0]:
left = mid + 1
elif val < li[mid][0]:
right = mid - 1
else:
return -1
@cal_time
def two_sum_3(nums, target):
"""時間複雜度:o(n*logn)
:param nums:
:param target:
:return:
"""nums_ = [[num, index] for index, num in enumerate(nums)]
nums_.sort(key=lambda x: x[0]) # 按值排序
for i in range(len(nums_)):
n1 = nums_[i][0]
n2 = target - n1
j = search(nums_, n2) # 二分法判斷n2是否在列表內
if j >= 0:
if n1 != n2:
return nums_[i][1], nums_[j][1]
else: # n1和n2重複
return nums.index(n1), nums.index(n2, nums.index(n1) + 1)
swift演算法 2sum 演算法
題目描述 給出乙個整數陣列和乙個目標值,判斷陣列中是否有兩個數之和等於目標值 1 粗暴的方法 每次選中乙個數,然後遍歷整個陣列,判斷是否有另乙個數使兩者之和為target 時間複雜度 o n 2 2 利用集合可以優化時間複雜度 思路 在遍歷陣列的過程中,用集合每次儲存當前值。假如集合中已經有乙個數等...
陣列 sum問題
題目一 輸出有序陣列a中,和為s的兩個數。如有多個,輸出乘積最小的兩個。思路 將兩個指標分別指向首尾,如果和與指定值相等,則返回 如和大於指定值,則右指標向左移動 如和小於指定值,則左指標向右移動。public arraylistfindnumberswithsum int array,int su...
六數碼問題
時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述現有一兩行三列的 如下 a b c d e f 把1 2 3 4 5 6六個數字分別填入a b c d e f格仔中,每個格仔乙個數字且各不相同。每種不同的填法稱為一種布局。如下 1 3 5 2 4 6 布局12 5 6 4 3...