用python手刃Leetcode(1):兩數之和【簡單題】

前言

博客裏新開一個「用python手刃Leetcode」的專題,顧名思義,主要目的是記錄本身在Leetcode上刷題的過程,代碼全程用python3編寫,所用網址是:leetcode中國。這個網址的好處是:1)純中文,解決了英語很差讀題困難的問題;2)網頁打開速度快。 ` 同時能夠看到:目前官網給出的解題代碼是用java編寫的,並無給出官方的python解答,本專欄除了儘可能使用多種解法給出每道題的python3解答代碼以外,還會記錄下本身在作題過程當中的一些收穫和思考。便於之後複習查閱。java

題目

給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。
你能夠假設每一個輸入只對應一種答案,且一樣的元素不能被重複利用。python

示例:數組

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

由於 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]函數

暴力解法

首先無論三七二十一,利用暴力解法來嘗試。優化

class Solution:
    def twoSum(self, nums, target):
        """ :type nums: List[int] :type target: int :rtype: List[int] """
        renum = []
        n = len(nums)
        for i in range(n):
            for j in range(i+1,n):
                if nums[i]+nums[j] == target:
                    renum.append(i)
                    renum.append(j)
                    break   
        return(renum)
複製代碼

【備註】:對於一個函數來講,程序在執行return()後會自動中止,即在函數中,return有break的功能。因此,以上代碼能夠作一個小優化:在break處直接寫return()函數。就像這樣:spa

……
if nums[i]+nums[j] == target:
	renum.append(i)
	renum.append(j)
	return(renum) #此處直接用return代替break
複製代碼

可是,這種暴力解法因爲時間複雜度過高,通常是沒有辦法來經過leetcode的,會報錯以下: .net

這裏寫圖片描述

方法二:創建哈希表進行求解。
class Solution:
    def twoSum(self, nums, target):
        """ :type nums: List[int] :type target: int :rtype: List[int] """
        dic = {}
        for i, num in enumerate(nums):
            if num in dic:
                return [dic[num], i]
            else:
                dic[target - num] = i
複製代碼

這個解法的思路是:首先把原來的List建成一個字典,而後新建另外一個空字典,每次在字典中存儲時,dic的key:target - num,value:原List組成的字典值對應的索引。若是檢測到某個nums中的值已經存在於新建的字典中,那麼證實能夠組成一個target值,這時返回此刻遍歷到的索引與dict中記錄下來的索引。code

方法三:利用python切片。
class Solution:
    def twoSum(self, nums, target):
        for i in range(len(nums)):
            if target-nums[i] in nums[i+1:]:
                return [i,nums.index(target-nums[i],i+1)]
複製代碼
解題收穫:
一、enumerate()函數的使用

enumerate()函數能夠把一個List按照索引從小到大的順序組成一個字典。 python enumerate用法總結cdn

二、python中定義Class的模板
相關文章
相關標籤/搜索