力扣18. 四数之和

题目来源(力扣):

https://leetcode.cn/problems/4sum/description/

题目描述:

在1个数组中找到4个元素,使得4个元素的和为target,返回所有的符合条件的4元组。
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target

基本思路:

力扣15. 三数之和做法相同,可见 https://www.cnblogs.com/hb-computer/articles/18493706

只是在此基础上多了一层循环,参考《代码随想录》中的写法,如下:

代码实现:

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; // 对第二个数去重
                for (int left = j + 1, right = nums.size() - 1; left < right;)
                {
                    long long val = (long long)nums[i] + nums[j] + nums[left] + nums[right];
                    if (val > target)
                        right--;
                    else if (val < target)
                        left++;
                    else
                    {
                        ans.push_back({nums[i], nums[j], nums[left], nums[right]}); // 每个nums[] 都在int范围内,但是他们的和可能超出int范围
                        while (left < right && nums[left] == nums[left + 1])
                            left++;
                        while (left < right && nums[right] == nums[right - 1])
                            right--;
                        left++, right--;
                    }
                }
            }
        }
        return ans;
    }
};

时间复杂度

O(n^3)

posted @ 2024-10-23 10:37  HB_Computer  阅读(18)  评论(0)    收藏  举报