题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
我的方案:
思路
遇到这个题,第一个想法就是暴力破解,使用双重循环遍历
算法
外循环从第一个开始遍历,内循环从第二个开始遍历,当两者之和相等时,将两个指针复制到新数组。
代码
- java:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] n = 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){
n[0]=i;
n[1] = j;
return n;
}
}
}
return null;
}
}
- C:
int* twoSum(int* nums, int numsSize, int target) {
int i;
int j;
static int num[2]= {0};
for (i = 0;i<numsSize-1;i++)
for (j = i+1; j<numsSize; j++)
if (nums[i] + nums[j] == target)
{
num[0] = i;
num[1] = j;
return num;
}
return 0;
}
官方方案
思想
由于哈希表查找元素速度恒定,且在无哈希冲突时,时间复杂度可以认为是O(1),所以这里使用以空间换时间的方式。而且巧妙地使用了先检查表后放入表的形式,实现了一次哈希表。
算法
新建Map对象,在循环中赋值complement为目标值与当前迭代值之差。当map对象中包含了这个complement的键值,将两者返回,否则将当前迭代值作为键、当前
代码
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(i=0;i<nums.length;i++){
//得到当前数组值与目标值之差
int complement = target-nums[i];
//当在Map中找到该差值时返回Map索引
if(map.contains(complement){
return new int[](map.get(complement), i);
}
//否则就将当前值与索引放入Map中
map.put(nums[i],i);
}
return null;
}
}