题目描述
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例
解题
解法一:暴力枚举
class Solution {
public int[] twoSum(int[] nums, int target) {
int i, j = 0;
for (i = 0; i < nums.length; i++) {
for (j = i+1; j < nums.length; j++) { //下标不能重复!
if (nums[i] + nums[j] == target) {
return new int[]{i,j};
}
}
}
return null;
}
}
对不起我是笨蛋,我只能想到用一个双重循环遍历所有的可能性去进行解题,第一次写的时候甚至没有考虑到下标不能重复,而且时间复杂度比较大,但优点是空间复杂度小
解法二:哈希表
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 null;
}
}
第二种方法是使用哈希表。
1.创建哈希表
2.遍历nums数组 如果哈希表中不包含target-nums[i],就将nums[i]放入哈希表中
最开始很自然的想法就是下标作为key,值作为value 但是最后你在返回两个下标时,需要获得值对应的下标 就更麻烦了 使用get方法,通过key获得value 在存放的时候 将下标作为value 值作为key更加合适 因为这道题中不存在两个数相同的情况 所以下标和值是一一对应的
最坏情况也只需要遍历一遍数组 即O(n) 但空间复杂度较高