给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。【也就是每一个位置的元素只能出现一次】
你可以按任意顺序返回答案。
示例1
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例2
输入:nums = [3,3], target = 6 输出:[0,1]
方法1:普通双指针(暴力破解)
双重循环遍历,代码实现如下
class Solution {
public int[] twoSum(int[] nums, int target) {
int arr[] = new int[2];
for(int i=0;i<nums.length-1;i++)
{
for(int j=i+1;j<nums.length;j++)
if(nums[i]+nums[j]==target)
{
arr[0]=i;
arr[1]=j;
return arr;
}
}
return arr;
}
}
时间复杂度 O(n^2)
空间复杂度 O(1)
方法2:哈希表【查找是O(1)】
①target-nums[i]如果在map中,返回map中的value 和i
(map中的key是元素,value是数组下标)
②target-nums[i]如果不在map中,将nums[i]和i存入map
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap();
for(int i=0;i<nums.length;i++)
{
int temp=target-nums[i];
if(map.containsKey(temp))//hashtable的查找是O(1)
{
return new int[] {map.get(temp),i};
}
else
map.put(nums[i],i);
}
return new int[]{};
}
}
时间复杂度 O(n)
空间复杂度 O(n) 哈希表的开销
另外一个思路,如果数组本身是有序的,那么用对撞指针非常容易做,大了J往中间走,i不动,小了,I往中间走,J不动