题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
解法1:暴力解法
思路:通过双重for循环遍历数组,依次将数组中两两元素相加,判断相加之和是否为目标值target,是则返回元素下标值;否则继续遍历;
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result = 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) {
result[0] = i;
result[1] = j;
}
}
}
return result;
}
}
这种方法简单直观,但时间复杂度较高,耗时65 ms。
解法2:哈希表法
思路:通过hashMap存放补数和下标值。一次循环遍历数组,求出元素的补数,若能在hashMap中找到补数,则返回该元素下标以及补数对应下标值;若找不到补数,那么将该元素及下标存放到hashMap中;
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
if (nums.length<2) return result;
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0;i<nums.length;i++) {
int nextNum = target - nums[i];
if (map.containsKey(nextNum)) {
result[0] = map.get(nextNum);
result[1] = i;
return result;
}
map.put(nums[i],i);
}
return result;
}
}
这种解法时间复杂度较低,耗时1ms。