两数之和
给定一个整数数组nums
和一个整数的值target
,请你在该数组中找出和目标值target
的那两个整数,并返回它们的数组下标。
1、暴力枚举
思路以及算法
最容易想到的方法是枚举数组中的每一个数x
,寻找数组中是否存在target
,x
。当我们使用遍历数组的方式寻找target-x
时,需要注意每一个位于x
之前的元素都已经和x
匹配过,因此不需要在此进行匹配。而每一个元素不能使用两次,所以我们只需要在x
后面的元素寻找target-x
.
代码
java
class solution{ public int[] twoSum(int[] nums,int target){ int n = nums.length; for(int i = 0;i < n;++i){ for(int j = j + 1; j < n;++j){ if(nums[i] + nums[j] == target){ return new int[][i,j]; } } } return new int[0]; } }
python
class Solution: def twoSum(self,nums:list[int],target:int) -> list[int]: n = len(nums) for i in range(n): for j in range(i+1,n): if num(i) + num(j) ==target: return[i,j] return[]
复杂度分析
时间:
O(N*N)
其中N是数组中的元素数量。最坏的情况下数组中的任意两个数匹配过一次。
空间:
O(1)
2、哈希表法
思路以及算法
使用哈希表,可以快速寻找数组中是否存在目标元素。
存在,找出索引。
可以将寻找target-x
的时间复杂度降低到从O(N)
降低到O(1)
。这样我们创建一个哈希表,对于每一个x
,我们首先查询哈希表是否存在target-x
,然后将x
插入到哈希表中,即可保证不会让x
和自己匹配。
代码
java
class solution{ public int[] twoSum(int[] nums,int target){ Map<Integer,Integer> hashtable = new HashMap<Integer,Integer>(); for(int i = 0;i < nums.length;++i){ if(hashtable.containsKey(target-nums[i])){ return new int[]{hashtable.get(target-nums[i]),i}; } hashtable.put(nums[i],i))'' } return new int[0]; }
python
class Solution: def twoSum(self,nums:list[int],target:int) -> list[int]: hashtable = dict() for i,num in enumerate(nums): if target - num in hashtable: return [hashtable[target - num],i] hashtable[num[i]] = i return[]
复杂度分析
时间:
O(N*N)
其中N是数组中的元素数量。最坏的情况下数组中的任意两个数匹配过一次。
空间:
O(1)