【算法专题突破】双指针 - 四数之和(8)

简介: 【算法专题突破】双指针 - 四数之和(8)

1. 题目解析

题目链接:18. 四数之和 - 力扣(Leetcode)

这道题跟三数之和也是一样的,

题目很好理解,就是四个数的和等于target的情况,

且这四个数不能重复。

2. 算法原理

首先还是暴力解法:

排序 + 暴力枚举 + set去重

我们当然是用优化的解法:

1. 依次固定一个数a

2. 然后在后面的区间,找到他们的和为target - a的数

3. 而三数之和,也是固定一个数b,然后找出他们的和为target - a - b的数

但是我们也要注意,需要跳过重复元素。

3. 代码编写

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, long long target) {
        int size = nums.size();
        vector<vector<int>> ans;
        sort(nums.begin(), nums.end());
        for(int i = 0; i < size - 3; i++) {
            int a = nums[i];
            for(int j = i + 1; j < size - 2; j++) {
                int b = nums[j];
                int left = j + 1, right = size - 1;
                while(left < right) {
                    int sum = nums[left] + nums[right];
                    if(sum < target - a - b) left++;
                    else if(sum > target - a - b) right--;
                    else { // sum == target - a - b
                        ans.push_back({nums[i], nums[j], nums[left], nums[right]});
                        while(left < right && nums[left] == nums[left + 1]) left++;
                        while(left < right && nums[right] == nums[right - 1]) right--;
                        left++, right--;
                    }
                }
                while(j < size - 2 && nums[j] == nums[j + 1]) j++;
            }
            while(i < size - 3 && nums[i] == nums[i + 1]) i++;
        }
        return ans;
    }
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关文章
|
2天前
|
存储 算法 容器
算法:双指针
算法:双指针
11 3
|
18天前
|
算法 前端开发 JavaScript
< 每日算法:一文带你认识 “ 双指针算法 ” >
`双指针`并非指的是一种具体的公式或者范式。而是一种运算思路,用于节省逻辑运算时间的`逻辑思路`!双指针算法通常用于`优化时间复杂度`!
< 每日算法:一文带你认识 “ 双指针算法 ” >
|
22天前
|
算法
|
28天前
|
算法
优选算法|【双指针】|611.有效三角形的个数
优选算法|【双指针】|611.有效三角形的个数
|
28天前
|
算法
优选算法|【双指针】|202.快乐数
优选算法|【双指针】|202.快乐数
|
28天前
|
算法
优选算法|【双指针】283.移动零
优选算法|【双指针】283.移动零
|
28天前
|
算法
优选算法|【双指针】|1089.复写零
优选算法|【双指针】|1089.复写零
|
29天前
|
算法
【优选算法专栏】专题一:双指针--------1.移动0
【优选算法专栏】专题一:双指针--------1.移动0
19 0
|
1月前
|
算法 C++
双指针算法·两数之和·三数之和
双指针算法·两数之和·三数之和
8 0
|
1月前
|
算法 C++ 容器
day1·算法-双指针
day1·算法-双指针
9 0