多值求和问题,在leetcode中,有一些考察多值加和问题,最简单的即两数之和为特定的值,暴力解法即先遍历一遍再在内层中进一步遍历,得到的方法即 O ( n 2 ) \mathcal{O(n^2)} O(n2) , 三值可以类似做法,得到的是 O ( n 3 ) \mathcal{O(n^3)} O(n3) ,毫无疑问,暴力法总是可以解决的, 但是对于数组变大,以及参与计算的值变多,导致计算量增长很大,并不是一个有效的方法
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] target_arr = new int[2];
int n = nums.length;
for(int i =0;i<n;i++){
for(int j = i+1; j <n;j++){
if(nums[i] + nums[j] == target){
target_arr[0] = i;
target_arr[1] = j;
return target_arr;
}
}
}
return target_arr;
}
}
可以利用hashmap进行计算,因为hashmap可以直接索引对应的值的key,恰好题目有一个隐藏条件,即每个数字只能使用一次;把值和对应的位置存储在hashmap即可,
class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0;i<n;i++){
map.put(nums[i],i);
}
for(int j = 0;j<n;j++){
if(map.containsKey(target -nums[j]) && map.get(target -nums[j]) != j){
return new int[] {j,map.get(target -nums[j])};
}
}
return new int[2];
}
}