【5分鐘力扣】01. 用python3實現兩數之和

一、前言

最近在刷力扣上的題目,之前也刷過很多次,一邊刷一邊忘,很是苦惱。

爲什麼邊學邊忘,很大程度是沒有應用場景,只是被動的進行填鴨式學習。

爲了提高學習效率,覺得還是得堅持寫博客,一方面強化記憶,第二強迫自己創造應用場景,學習知識的同時也在產生知識。

在這裏插入圖片描述

二、題目

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。

示例:

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

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/two-sum

三、暴力解題法

3.1 思路:

用for循環將數組中的元素和後面的元素分別相加,看是否等於 target ,如果不等於 target,那麼就繼續拿數組裏的第二個數字和後面的數字相加;不停的去一個個試…直到等於target,返回這2個數字所在的下標。

nums = [2, 7, 11, 15]
target = 9
def twoSum(nums,target):
    n = len(nums)  # # 獲取nums的長度,是4
    for x in range(n): # # 外層循環先取出下標0,對應着數組裏的第一個數字
        for y in range(x+1, n):  # 內層循環取出下標1,對應着數組裏的第二個數字
            if nums[x] + nums[y] == target:  # 如果滿足條件則return下標
                return [x, y]
            else:   # 不滿足則跳過當前循環
                continue
    return None  # 都不滿足,則返回None

a = twoSum(nums,target)
print(a)

在這裏插入圖片描述
3.2 總結:

提交力扣,這種解法比較耗時和佔用內存,繼續優化。

四、容器緩存法

4.1 思路

  • 先遍歷所有的數組元素_—— nums[i],計算 target - nums[i],並將結果緩存到容器中,在後續循環中,如果再看到這個值,則返回兩者的下標位置。

  • 空間複雜度:O(n)

  • 時間複雜度:O(n)

# 容器緩存法

nums = [2, 7, 11, 15]
target = 9
def twoSum(nums,target):
    lis = {}  # 設置一個容器字典,用來緩存結果和下標
    for index, num in enumerate(nums):  # 獲取數值和下表
        result = target - num  # 結果
        if num in lis:  # 如果數值存在容器中,則返回第一個數值下標,和當前數值下標
            return [lis[num], index]
        lis[result] = index  # 將結果作爲容器的key,數值的下標作爲value
    return None

print(twoSum(nums,target))

在這裏插入圖片描述

4.2 總結:

用時縮短接近10倍

五、相關知識點

容器中的操作時間複雜度: https://wiki.python.org/moin/TimeComplexity

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章