当前位置: 首页 > article >正文

【优选算法】四数之和(双指针算法)

必须有为成功付出代价的决心,然后想办法付出这个代价。

目录

1.【题目链接】 

2.【算法原理】

3.【代码】


1.【题目链接】 

18. 四数之和 - 力扣(LeetCode)

2.【算法原理】

与前面三数之和原理很像

解法一:排序 + 暴力枚举 + 利用set去重(超时)

用四个for循环枚举出所有情况再去重。

解法二 :

  1. 排序
  2. 先固定一个数 a
  3. 剩下的范围进行 “三数之和” 算法,找到三个数使和等于 target - a(三数之和:先固定一个数 b,再利用双指针算法求剩下的数之和为 target - a - b)

注意:

  1. 去重:对 left、right、a、b 进行去重
  2. 不漏:在找到一种结果之后,left ++,right -- 继续寻找

3.【代码】

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ret;
        int n = nums.size();
        //1.排序
        sort(nums.begin(), nums.end());

        //2.先固定一个数a,在剩下的数里面利用三数之和等于target-a
        for (int i = 0; i < n; )
        {
            //先固定一个数b,在剩下的数里面利用双指针算法
            for (int j = i + 1; j < n; )
            {
                int left = j + 1, right = n - 1;
                //避免数据溢出,我们用long long类型
                long long count = (long long)target - nums[i] - nums[j];
                while (left < right)
                {
                    int sum = nums[left] + nums[right];
                    if (sum > count) right--;
                    else if (sum < count) left++;
                    else
                    {
                        ret.push_back({ nums[i],nums[j],nums[left++],nums[right--] });
                        //去重一,left和right
                        while (left < right && nums[left] == nums[left - 1]) left++;
                        while (left < right && nums[right] == nums[right + 1]) right--;
                    }
                }
                //去重二
                j++;
                while (j < n && nums[j] == nums[j - 1]) j++;
            }
            //去重三
            i++;
            while (i < n && nums[i] == nums[i - 1]) i++;
        }
        return ret;
    }
};

完——


看完算法原理一定要先自己尝试写代码,不要直接看,这样做很锻炼自己的代码能力。

前面的三数之和题如果理解透彻且代码能够自己写出来,其实这道四数之和题自己也是能够写出来的,就是这道题有一个数据溢出的问题解决一下就好了。

双指针算法就此结束了,下一个算法思想开始。。。


http://www.kler.cn/a/508070.html

相关文章:

  • Go语言简洁框架目录和高效的快发框架设计
  • @Scope(“prototype“)
  • 企业邮箱iRedMail搭建
  • 警惕IDEA 2024版重大Bug问题:LomBok失效、Gradle冲突、Spring Boot启动错误
  • 关于vite+vue3+ts项目中env.d.ts 文件详解
  • 【机器学习实战入门】使用OpenCV和Keras的驾驶员疲劳检测系统
  • 3D扫描仪在文博行业的应用有哪些?
  • 当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线
  • 【golang学习之旅】使用VScode安装配置Go开发环境
  • 单元测试与unittest框架
  • MySQL DCL 数据控制
  • linux下的NFS和FTP部署
  • NSIS 创建一键安装程序
  • Neo4j图数据库学习(二)——SpringBoot整合Neo4j
  • 《AIGC:开启智能创作新时代》
  • 145.《redis原生超详细使用》
  • 2024春秋杯冬季赛-Misc部分WP
  • Red Hat8:搭建FTP服务器
  • 基于单片机的智能生态鱼缸的设计
  • 异步任务与定时任务
  • 二百八十三、Java——IDEA中通过快捷键查看某一类的定义位置
  • Linux下的dev,sys和proc(TODO)
  • OpenCV阈值
  • 【C语言】_内存拷贝函数memcpy与memmove
  • Matplotlib基础
  • 【Elasticsearch】搜索类型介绍,以及使用SpringBoot实现,并展现给前端