咱們都知道算法是程序員成長重要的一環,怎麼才能提升算法呢, 出來在網上看視頻以外,動手練習是很是重要的。leetcode 就是一個很是好的鍛鍊平臺。程序員
1. 兩數之和,在 leetcode 裏面是屬於 easy 級別的。咱們看看他的題目和解法。算法
題目: 給定一個整數數組 nums
和一個目標值 target
,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。數組
例子: app
給定 nums = [2, 7, 11, 15], target = 9 由於 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1] 題目說的很清楚, 給出一個列表和一個 目標值,找出列表中兩數之和是 目標值的, 一個數不可重複使用。
思路:學習
個人思路是 循環遍歷每個數記做 index,而後 用 目標值(target)減去 index,看結果在不在這個列表裏。spa
代碼:code
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. 兩數相加blog
題目: 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,而且它們的每一個節點只能存儲 一位 數字。若是,咱們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。您能夠假設除了數字 0 以外,這兩個數都不會以 0 開頭。leetcode
例子:
輸入:(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:
若是有不合理或者錯誤的地方,必定評論我,或者私聊我改正,以防誤人子弟。不勝感激。謝謝。同時也期盼與每一位的相遇相識。