題目描述
1. 兩數之和
給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個整數,并回傳他們的陣列下標,
你可以假設每種輸入只會對應一個答案,但是,你不能重復利用這個陣列中同樣的元素,
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以回傳 [0, 1]
題目決議
方法一:暴力法
解題思路
首先我們可以通過兩層回圈的方式來求解,外層回圈用于固定元素 nums[i] ,記憶體回圈從下標 j=i+1 開始遍歷至陣列結尾,比較兩數之和 nums[i] + nums[j] 與target值是否相等,若相等則直接回傳結果 [i,j] ,
代碼示例
Java:
public int[] twoSum(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return new int[]{};
}
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; i < nums.length; j++) {
if (nums[i] + nums[j] == target) {
return new int[]{i,j};
}
}
}
return new int[]{};
}
Python3:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_len = len(nums)
for i in range(nums_len):
for j in range(i + 1, nums_len):
if nums[i] == target - nums[j]:
return [i, j]
Go:
func twoSum(nums []int, target int) []int {
for i := 0; i < len(nums); i++ {
for j := i + 1; j < len(nums); j++ {
if nums[i] + nums[j] == target {
return []int{i,j}
}
}
}
return []int{}
}
復雜度分析
時間復雜度:O(n^2)
空間復雜度:O(1)
方法二:兩遍哈希表遍歷
解題思路
暴力法解決該問題采用兩層回圈方式,時間復雜度較高為O(n^2),我們可采用 空間換時間 的方式降低演算法的時間復雜度,哈希表的查詢時間復雜度為O(1),我們可以將陣列元素作為key,元素下標作為value存入哈希表中,遍歷陣列元素 nums[i] ,計算差值 target - nums[i] ,判斷差值是否在哈希表中且下標值不為i,若存在則將元素下標回傳,
代碼示例
Java:
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int diff = target - nums[i];
if (map.containsKey(diff) && map.get(diff) != i) {
return new int[]{i, map.get(diff)};
}
}
return new int[]{};
}
Python3:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_map = {}
for key, value in enumerate(nums):
nums_map[value] = key
for key, value in enumerate(nums):
left = target - value
if nums_map.get(left, False) and key != nums_map[left]:
return [key, nums_map[left]]
Go:
func twoSum(nums []int, target int) []int {
numsMap := make(map[int]int)
for i, num := range nums {
numsMap[num] = i
}
for i, num := range nums {
if j, exist := numsMap[target - num]; exist && i != j {
return []int{i, j}
}
}
return []int{}
}
復雜度分析
時間復雜度:O(n)
空間復雜度:O(n)
方法三:一遍哈希表遍歷
解題思路
題目中提到 不能重復利用這個陣列中同樣的元素 ,我們可以考慮只采用一次遍歷的方式求解,在遍歷陣列元素 nums[i] 的程序中我們可以判斷差值 target-nums[i] 是否存在于哈希表中,若不存在則將 nums[i] 的值作為key,下標作為value存入哈希表中,否則直接回傳結果,
代碼示例
Java:
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int diff = target - nums[i];
if (map.containsKey(diff)) {
return new int[]{map.get(diff), i};
}
map.put(nums[i], i);
}
return new int[]{};
}
Python3:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_map = {}
for key, value in enumerate(nums):
left = target - value
if left in nums_map:
return [nums_map[left], key]
nums_map[value] = key
Go:
func twoSum(nums []int, target int) []int {
numsMap := make(map[int]int)
for i, num := range nums {
if j, exist := numsMap[target - num]; exist {
return []int{j, i}
}
numsMap[num] = i
}
return []int{}
}
復雜度分析
時間復雜度:O(n)
空間復雜度:O(n)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/67590.html
標籤:其他
上一篇:求阿里云邀請碼
