leetcode1. 两数之和、15. 三数之和、18. 四数之和
注意,这个要返回的是对应数字的下标。
2022/09的C++代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int size=nums.size();
unordered_map<int,int> mapmap;
for(int i=0;i<size;i++){
auto it=mapmap.find(target-nums[i]);
if(it == mapmap.end()){
mapmap[nums[i]]=i;
//mapmap.insert(pair<int, int>(nums[i], i));//另一种添加方法
}
else{
return {it->second,i};
}
}
return {};
}
};
2025/10的Java代码
class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
int[] res = new int[2];
HashMap<Integer,Integer> record = new HashMap<>();
for(int i = 0;i < n;++i){
if(record.containsKey(nums[i]) && nums[i] * 2 == target){
res[0] = record.get(nums[i]);res[1] = i;
return res;
}
int minus = target - nums[i];
if(record.containsKey(minus) && i != record.get(minus)){//保证不是同一个元素用两次
res[0] = i;res[1] = record.get(minus);
return res;
}
record.put(nums[i],i);
}
return res;
}
}
注意,这个返回的是具体数字,不能重复,比如[ -1 , 0 , 1 ] 和 [ -1 , 1 , 0 ]就是重复的。
以下为无法通过的超时解,每次添加前都查找是否已存在太耗时间了。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int n = nums.length;
Arrays.sort(nums);
for(int i = 0;i < n;++i){
if(nums[i] > 0) break;
if(i != 0 && nums[i] == nums[i-1]) continue;
HashMap<Integer,Integer> record = new HashMap<>();//记录本轮目标值为(0-nums[i])的哈希表
int target1 = 0 - nums[i];
for(int j = i + 1;j < n;++j){
if(record.containsKey(nums[j]) && nums[j] * 2 == target1){
List<Integer> thisRes = new ArrayList<>(Arrays.asList(nums[i],nums[j],nums[j]));
if(!res.contains(thisRes)) res.add(thisRes);
continue;
}
int target2 = target1 - nums[j];
if(record.containsKey(target2) && j != record.get(target2)){
List<Integer> thisRes = new ArrayList<>(Arrays.asList(nums[i],nums[record.get(target2)],nums[j]));
//res.add(new ArrayList<>(Arrays.asList(nums[i],nums[record.get(target2)],nums[j])));
if(!res.contains(thisRes)) res.add(thisRes);
continue;
}
record.put(nums[j],j);
}
}
return res;
}
}
以上代码改成HashSet,最后再转为List返回就可以通过。保证添加到HashSet时ArrayList是有序的。
但还是太低效。用时417ms,击败5.01%,内存52.50MB,击败5.00%。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
HashSet<List<Integer>> resSet = new HashSet<>();
int n = nums.length;
Arrays.sort(nums);
for(int i = 0;i < n;++i){
if(nums[i] > 0) break;
if(i != 0 && nums[i] == nums[i-1]) continue;
HashMap<Integer,Integer> record = new HashMap<>();//记录本轮目标值为(0-nums[i])的哈希表
int target1 = 0 - nums[i];
for(int j = i + 1;j < n;++j){
if(record.containsKey(nums[j]) && nums[j] * 2 == target1){
resSet.add(new ArrayList<>(Arrays.asList(nums[i],nums[j],nums[j])));
continue;
}
int target2 = target1 - nums[j];
if(record.containsKey(target2) && j != record.get(target2)){
resSet.add(new ArrayList<>(Arrays.asList(nums[i],nums[record.get(target2)],nums[j])));
continue;
}
record.put(nums[j],j);
}
}
return new ArrayList<>(resSet);
}
}