【C++】双指针算法:四数之和

1.题目

2.算法思路

这道题目十分困难,在leetcode上的通过率只有36%,大家要做好心理准备。

在做个题目前强烈建议大家先看看我的上一篇博客:有效三角形个数,看完之后再去leetcode上写一写三数之和,搞懂那两个题目之后再来看这道题目就比较容易了。

四数之和实际上和三数之和的思路差不多,只不过比三数之和多了一个步骤。

首先我们需要把这个数组排一下序,然后固定一个数a,然后在剩下的区间利用三数之和的思路解决。

三数之和的思路:

固定一个数b,然后定义两个指针left和right,分别从两端遍历数组,如果这四个数大于目标值则right--。如果这四个数小于目标值则left++。如果等于目标值,则记录下来,更新right或left,继续遍历。在这个过程中要注意:1.不漏 2.去重 3.防止整型溢出。

3.代码和提交结果

3.1提交结果

3.2代码

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> num_s;
        sort(nums.begin(),nums.end());
        for(int i=nums.size()-1;i>=3;){//固定数a
            long long nums1=nums[i];
            for(int j=i-1;j>=2;){//固定数b
                long long nums2=nums[j];//防止计算四数之和时整型溢出
                int right=j-1,left=0;
                while(right>left){
                    //计算四数之和
                    if(nums1+nums2+nums[left]+nums[right]<target) left++;
                    else if(nums1+nums2+nums[left]+nums[right]>target) right--;
                    else{
                        num_s.push_back({nums[left],nums[right],(int)nums2,(int)nums1});
                        do{
                            right--;//去重
                        }while(right>left&&nums[right]==nums[right+1]);
                    }
                }
                do{
                    j--;//去重
                }while(j>=2&&nums[j]==nums[j+1]);
            }
            do{
                i--;//去重
            }while(i>=3&&nums[i]==nums[i+1]);
        }
        return num_s;
    }
};

时间复杂度分析:

三次遍历数组相互嵌套,所以时间复杂度:O(n^3)。

相关推荐

  1. 指针算法篇:两之和 、三之和

    2024-05-03 13:46:10       19 阅读
  2. 每日OJ题_算法_指针⑧力扣18. 之和

    2024-05-03 13:46:10       45 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-03 13:46:10       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-03 13:46:10       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-03 13:46:10       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-03 13:46:10       18 阅读

热门阅读

  1. RSA实现中弱密钥漏洞分析

    2024-05-03 13:46:10       11 阅读
  2. Django响应‘表单请求’过程

    2024-05-03 13:46:10       11 阅读
  3. Django运行不提示网址问题

    2024-05-03 13:46:10       10 阅读
  4. 02 C

    2024-05-03 13:46:10       11 阅读
  5. Python的定义和调用函数

    2024-05-03 13:46:10       12 阅读
  6. 初识Vue-组件化开发(详解各个组件)

    2024-05-03 13:46:10       11 阅读
  7. Pytorch学习笔记——Transforms的使用

    2024-05-03 13:46:10       12 阅读
  8. 区块链 | IPFS:Merkle DAG

    2024-05-03 13:46:10       13 阅读
  9. ES常用查询方式

    2024-05-03 13:46:10       12 阅读
  10. 服务器分类

    2024-05-03 13:46:10       10 阅读
  11. Android 编译文件简述(Android.mk)

    2024-05-03 13:46:10       12 阅读