题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
题解一------暴力枚举
c
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
for(int i=0;i<numsSize - 1;i++)
{
for(int j=i+1;j<numsSize;j++)
{
if(nums[i]+nums[j]==target)
{
int* result=malloc(sizeof(int)*2);
result[0]=i;
result[1]=j;
(*returnSize)=2;
return result;
}
}
}
return NULL;
利用双重for循环依次遍历出数组中的所有的两个值之和
优点:简单不动脑
缺点:时间复杂度高,时间复杂度为O(n^2)
题解二------哈希表法
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];
}
}
哈希表利用Java会更简便
方法:创建一个哈希表,先将数组中第一个值输入进去,然后依次用target-x的值与哈希表中的所有值进行对比,如果没有相等的,就将x值输入进哈希表,反之就将x与target-x对应的数组下标存入结果数组中
优点:时间复杂度下降为O(n)
缺点:以空间换时间,需要额外申请一块(n-1)内存大小的空间