1. 程式人生 > 其它 >演算法刷題筆記

演算法刷題筆記

1、兩數之和

1.1 題目大意 

描述:給定一個整數陣列 nums 和一個整數目標值 target

要求:在該陣列中找出和為 target 的兩個整數,並輸出這兩個整數的下標。

1.2 解題思路 

最簡單的思路是列舉陣列中每一個數 nums[i],尋找陣列中是否存在 target - nums[i]

這樣利用兩重迴圈暴力搜素,時間複雜度為 O(n2)。

另一種思路是利用字典。字典中鍵值對資訊為 target-nums[i] :ii 為下標。

遍歷陣列,對於每一個數 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