題目描述
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
求解
1. 方法:暴力求解法
思路:
內層循環從數組中取出下標爲 i 的元素 num[i] ,內層循環取出 i 之後的元素 nums[j] 一一與 下標爲 i
的元素進行相加操作,判斷結果是否爲 target 。爲什麼內層循環要取i 之後的元素的元素呢?因爲如果第二輪取得i 之前的數的話,其實我們
之前就已經考慮過這種情況了(即外層循環已經遍歷過此時內層循環的這個數字)。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
# 第一輪遍歷
for i in range(len(nums)):
# 第二輪遍歷不能重複計算了
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
# 注意 leetcode 中要求返回的是索引位置
return [i, j]
時間複雜度: 兩次遍歷O(n^2)
空間複雜度:只有兩個數組,是(n)
2. 方法: 字典法
- 建立字典 lookup 存放第一個數字,並存放該數字的 index ;
- 判斷 lookup 中是否存在 target - 當前數字cur , 則當前值cur 和某個lookup 中的key 值相加之和爲 target ;
- 如果存在,則返回: target - 當前數字cur 的 index 與 當前值 cur 的 index ;
- 如果不存在則將當前數字 cur 爲key,當前數字的 index 爲值存入 lookup 。
class Solution:
def twoSum(self, nums, target):
dict1={}
for i in range(0,len(nums)):
num2=target-nums[i]
if num2 not in dict1:
dict1[nums[i]]=i
else:
return [dict1[num2],i]
時間複雜度: 1 次遍歷O(n)
空間複雜度:只有兩個數組,是(n)