Leetcode第十八题(四数之和)

简介: 这篇博客介绍了LeetCode第18题“四数之和”的解法,通过排序和双指针技术来找出数组中所有和为特定值的四个不同元素的组合。

题目描述:

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

示例 1:输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

​
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ans;
        sort(nums.begin(),nums.end());
        //寻找第三个,第四个数
        for(int i = 0; i < nums.size(); i++){
            //去重
            if(i > 0 && nums[i] == nums[i -1]) continue;
            for(int j = i + 1;j < nums.size(); j++){
                //去重
                if(j > i + 1 && nums[j] == nums[j - 1]) continue;
                //寻找第一个跟第二个数
                int sum = target - nums[i] - nums[j];
                int l = j + 1,r = nums.size() - 1;
                while(l < r){
                    if(sum == nums[l] + nums[r]){
                        ans.push_back({nums[i],nums[j],nums[l],nums[r]});
                        while(l < r && nums[l] == nums[l + 1]) l++;
                        while(l < r && nums[r] == nums[r - 1]) r--;
                        l++,r--;
                    }
                    else if(sum < nums[l] + nums[r])
                        r--;
                    else
                        l++;
                }
            }
        }
        return ans;
    }
};

​

在十五题三数之和的基础之上, 在外层套一层循环寻找第四个数

相关文章
|
5月前
|
机器学习/深度学习 算法
leetcode51N皇后刷题打卡
leetcode51N皇后刷题打卡
45 0
|
1天前
|
存储
Leetcode第十五题(三数之和)
LeetCode第十五题“三数之和”要求在一个整数数组中找出所有不重复的三元组,使得它们的和为0,通常通过先排序再使用双指针法来解决。
8 0
Leetcode第十五题(三数之和)
|
1天前
|
算法
Leetcode第十四题(最长公共前缀)
这篇文章介绍了一种算法,用于在给定的字符串数组中找到最长公共前缀,通过逐字符比较每个字符串的对应位置,一旦发现不匹配立即返回当前已匹配的子串作为公共前缀。
7 0
|
11月前
|
算法
代码随想录算法训练营第二十八天 | LeetCode 491. 递增子序列、46. 全排列、47. 全排列 II
代码随想录算法训练营第二十八天 | LeetCode 491. 递增子序列、46. 全排列、47. 全排列 II
56 0
|
11月前
|
算法
代码随想录算法训练营第七天 | LeetCode 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
代码随想录算法训练营第七天 | LeetCode 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
41 0
代码随想录刷题|LeetCode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
代码随想录刷题|LeetCode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
代码随想录刷题|LeetCode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
|
存储 算法 Java
代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独
代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独
代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独
|
算法 前端开发 程序员
「LeetCode」18-四数之和⚡️
「LeetCode」18-四数之和⚡️
124 0
「LeetCode」18-四数之和⚡️
|
算法 前端开发 程序员
「LeetCode」53-最大子数组和⚡️
「LeetCode」53-最大子数组和⚡️
110 0
「LeetCode」53-最大子数组和⚡️