Two Sum
原题链接:点这里
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
第一种解法
暴力循环
利用两次循环求出满足条件的结果
代码:
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length;i++)
for(int j=i+1;j<nums.length;j++)
{
if(nums[i]+nums[j]==target)
return new int[] {i,j};
}
return null;
}
时间复杂度:o(n2)
第二种解法
由第一种解法可知,第二层循环主要目的是为了寻找是否有**target-nums[i]**这个值,所以我们想到了找一个容器,也就是map,来直接告诉我们这个值是否存在。
map中key不能重复,需要考虑到这一点。
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> dataMap=new HashMap<>();
for(int i=0;i<nums.length;i++)
{
Integer index = dataMap.get(nums[i]);
if(Objects.nonNull(index)&&nums[i]+nums[i]==target)
{return new int[] {index,i};}
dataMap.put(nums[i], i);
}
for(int i=0;i<nums.length;i++)
{
Integer index=dataMap.get(target-nums[i]);
if(Objects.nonNull(index)&&index!=i)
return new int[] {i,index};
}
return null;
}