题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路
该题目的解题思路比较简单,直接双重循环即可求解。提交之后也没有什么问题,顺利通过。但是如果数组元素个数n
特别大,此时该做法就可能会出现超时的情况。下面介绍一种时间复杂度较低的做法—哈希表。首先遍历一遍数组,将所有的元素存储到哈希表中(元素作为键,索引作为值),然后再遍历一次,对每一个元素array[i]
寻找target-array[i]
是否在表中,在则返回索引,程序结束。该做法是以空间换取时间的做法,进行存储哈希表组要占用
O
(
n
)
O(n)
O(n)的空间,查找也需要占用
O
(
n
)
O(n)
O(n)的时间复杂度,查找时,哈希表均摊到每个元素的时间复杂度是
O
(
1
)
O(1)
O(1)。
示例代码
- 双重循环暴力求解
public int[] twoSum(int[] nums, int target) {
int[] a = new int[2];
for(int i=0; i<nums.length; i++) {
for(int j=i+1; j<nums.length; j++) {
if(nums[i] + nums[j] == target) {
a[0] = i;
a[1] = j;
return a;
}
}
}
return a;
}
- 哈希表求解
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
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 tmp = target - nums[i];
if(map.containsKey(tmp) && map.get(tmp) != i) {
result[0] = i;
result[1] = map.get(tmp);
return result;
}
}
return result;
}