题目内容:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
解法:
1.暴力两遍for循环,如果有两数相加为结果的例子,那么这个例子就是答案:
//以c语言为例:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int* res = (int *)malloc(sizeof(int) * 2);
for(int i = 0; i < numsSize-1; i++) {
for(int j = i + 1; j < numsSize; j++) {
if(nums[i] + nums [j] == target) {
res[0] = i;
res[1] = j;
*returnSize = 2;
return res;
}
}
}
return res;
}
但是,这种写法时间复杂度比较高,不推荐(如果面试敢这么写,那么大概率可以准备下一个了)
2.一遍循环+哈希表解决
//以java为例:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
这种方法用空间换时间。逻辑其实是简化了for循环,将两遍for循环转化为只遍历一遍,然后通过查表的方法来寻找(两遍for循环的时间复杂度是O(n^2),而一遍for循环的时间复杂度是O(n),且哈希表操作时间复杂度为O(1))
总结
在查找或者遍历的问题上,能用hash表的情况别用暴力循环。