leetcode 熱題100--11-兩數之和

題目描述

給定一個整數數組 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. 方法: 字典法

  1. 建立字典 lookup 存放第一個數字,並存放該數字的 index ;
  2. 判斷 lookup 中是否存在 target - 當前數字cur , 則當前值cur 和某個lookup 中的key 值相加之和爲 target ;
  3. 如果存在,則返回: target - 當前數字cur 的 index 與 當前值 cur 的 index ;
  4. 如果不存在則將當前數字 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)

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