演算法刷題筆記
阿新 • • 發佈:2022-03-26
1、兩數之和
1.1 題目大意
描述:給定一個整數陣列 nums
和一個整數目標值 target
。
要求:在該陣列中找出和為 target
的兩個整數,並輸出這兩個整數的下標。
1.2 解題思路
最簡單的思路是列舉陣列中每一個數 nums[i]
,尋找陣列中是否存在 target - nums[i]
。
這樣利用兩重迴圈暴力搜素,時間複雜度為 O(n2)。
另一種思路是利用字典。字典中鍵值對資訊為 target-nums[i] :i
。i
為下標。
遍歷陣列,對於每一個數 nums[i]
,先查詢字典中是否存在 target - nums[i]
,存在則輸出 target - nums[i]
對應的下標和當前陣列的下標 i
target-nums[i]
的下標 i
。
1.3 程式碼
def twoSum(self, nums: List[int], target: int) -> List[int]:
numDict = dict()
for i in range(len(nums)):
if target-nums[i] in numDict:
return numDict[target-nums[i]], i
numDict[nums[i]] = i
return [0]
2、兩數相加
2.1 題目大意
描述:給定兩個非空的連結串列 l1
和 l2
。分別用來表示兩個非負整數,每位數字都是按照逆序的方式儲存的,每個節點儲存一位數字。
要求:計算兩個非負整數的和,並逆序返回表示和的連結串列。
2.2 解題思路
模擬大數加法,按位相加,將結果新增到新連結串列上。需要注意進位和對 10 取餘。
2.3 程式碼
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
head = curr = ListNode(0)
carry = 0
while l1 or l2 or carry:
if l1:
num1 = l1.val
l1 = l1.next
else:
num1 = 0
if l2:
num2 = l2.val
l2 = l2.next
else:
num2 = 0
sum = num1 + num2 + carry
carry = sum // 10
curr.next = ListNode(sum % 10)
curr = curr.next
return head.next