兩數之和,兩數相加(leetcode)


我們都知道算法是程序員成長重要的一環,怎么才能提高算法呢, 出來在網上看視頻之外,動手練習是非常重要的。leetcode 就是一個非常好的鍛煉平台。

1. 兩數之和,在 leetcode 里面是屬於 easy 級別的。我們看看他的題目和解法。

題目: 給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。你可以假設每種輸入只會對應一個答案。但是,你不能重復利用這個數組中同樣的元素。

例子: 

給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

題目說的很清楚, 給出一個列表和一個 目標值,找出列表中兩數之和是 目標值的, 一個數不可重復使用。

思路:

我的思路是 循環遍歷每一個數記作 index,然后 用 目標值(target)減去 index,看結果在不在這個列表里。

代碼:

 1     def twoSum(self, nums, target):
 2         """
 3         :type nums: List[int]
 4         :type target: int
 5         :rtype: List[int]
 6         """
 7         res_list = []
 8         for index, item in enumerate(nums):
 9             res = target - item
10             if res in nums:
11                 res_index = nums.index(res)
12                 if res_index != index:
13                     res_list.append(index)
14                     res_list.append(res_index)
15                     break
16         
17         return res_list

總結:我的這個解法雖然不是最優解,但是總比雙重 for 循環好一點(自我感覺)。時間復雜度 為 O(n),  空間復雜度 為 O(n)。

2. 兩數相加

題目: 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

例子:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

思路:逆序的兩個簡單鏈表,取出數相加 大於10 進1,別忘了最后一位相加大於 10 所進的 1.

代碼:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        res = ListNode(0)
        cur = res
        carry = 0
        while l1 or l2:
            n1 = l1.val if l1 != None else 0
            n2 = l2.val if l2 != None else 0
            sum = n1 + n2 + carry
            carry = 1 if sum >= 10 else 0
            cur.next = ListNode(sum % 10)
            cur = cur.next
            l1 = l1.next if l1 != None else None
            l2 = l2.next if l2 != None else None
        if carry != 0:
            cur.next = ListNode(1)
        return res.next

總結: 這是我模仿 Java 的寫法,自己還沒有想出特別的解法,有優秀的 Python 解法,大佬一定評論,讓我學習學習。時間復雜度 O(n), leetcode 官方解釋的更准確是:

時間復雜度:O(\max(m, n))O(max(m,n)),假設 mm 和 nn 分別表示 l1l1 和 l2l2 的長度,上面的算法最多重復 \max(m, n)max(m,n) 次。

空間復雜度:O(\max(m, n))O(max(m,n)), 新列表的長度最多為 \max(m,n) + 1max(m,n)+1。

參考一下。

ps:

  如果有不合理或者錯誤的地方,一定評論我,或者私聊我改正,以防誤人子弟。不勝感激。謝謝。同時也期盼與每一位的相遇相識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM