LeetCode每日1题--四数之和

简介: LeetCode每日1题--四数之和

前言


算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image.png


刷题网站


代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!


画图软件


OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!


笔记软件


Typoral


题目


image.png


解析


双指针

刚写过三数之和,又来四数之和?这能难住我吗?哈哈哈!

其实四数之和跟三数之后一个思路,都是使用双指针法,所以就是在三数之和的基础上在套一个for循环就能实现四数之和

  1. 使用四个指针(a<b<c<d)。最小的a和b在左边,c=b+1,d=数组的大小-1 只需要移动后两个指针然后包夹求解即可。
  2. 保存使得nums[a]+nums[b]+nums[c]+nums[d]==target的解。
  3. target偏大d向左移动,偏小时c右移。如果c和d相遇,就说明以a和b为最小值已经全部求完了。所以需要更换值了,我们需要先更换b的值,所以我们b++,进入下一轮循环。当b的循环结束了,a++,进入a的循环

我们是不是还忘了一件事?没错!我们还需要先对数组元素进行排序才能用这个方法

剪纸操作(去除重复解):

我们要确保移动指针后,对应的数字要发生改变才行哦。


public List<List<Integer>> fourSum(int[] nums, int target) {
        //存放结果集
        List<List<Integer>> result = new ArrayList<>();
        //使用双指针必须排序
        Arrays.sort(nums);
        //控制第一层循环
        for (int i = 0; i < nums.length; i++) {
            // nums[i] > target 直接返回, 返回为空,因为第一个数都大于目标值的话后面相加不可能等于target
            if (nums[i] > 0 && nums[i] > target) {
                return result;
            }
            //对第一个指针进行一个去重的操作
//            这里的i>0是为了预防数组越界
            if (i > 0 && nums[i - 1] == nums[i]) {
                continue;
            }
            //控制第二层循环
            for (int j = i + 1; j < nums.length; j++) {
                //对第二个指针进行去重的操作
                if (j > i + 1 && nums[j - 1] == nums[j]) {
                    continue;
                }
                //第三个指针的位置
                int left = j + 1;
                //第四个指针的位置
                int right = nums.length - 1;
                //控制第三个和第四个指针碰头,另外两个指针不动
                while (right > left) {
                    //计算是否等于目标值
                    long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
                    //如果target小于sum,第四个指针左移,因为第三个指针已经是数组中倒数第三小的了
                    if (sum > target) {
                        right--;
                        //如果target大于sum,移动第三个指针,因为第四个指针已经是数组中最大值了
                    } else if (sum < target) {
                        left++;
                        //如果target等于sum,那么返回数组中的数对应的索引下标,并把它们当成集合的形式传到结果集中
                    } else {
                        result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
                        //找到结果之后还要对三、四指针进行去重操作
                        while (right > left && nums[right] == nums[right - 1]) right--;
                        while (right > left && nums[left] == nums[left + 1]) left++;
                        //如果不重复那就三、四指针正常移动
                        left++;
                        right--;
                    }
                }
            }
        }
        //返回结果集
        return result;
    }

代码中也有详细的解释,实在不明白的话可以dubug一下



相关文章
|
2天前
|
云安全 人工智能 自然语言处理
AI说的每一句话,都靠谱吗?
阿里云提供AI全栈安全能力,其中针对AI输入与输出环节的安全合规挑战,我们构建了“开箱即用”与“按需增强”相结合的多层次、可配置的内容安全机制。
|
6天前
|
存储 人工智能 安全
AI 越智能,数据越危险?
阿里云提供AI全栈安全能力,为客户构建全链路数据保护体系,让企业敢用、能用、放心用
|
9天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
3天前
|
消息中间件 安全 NoSQL
阿里云通过中国信通院首批安全可信中间件评估
近日,由中国信通院主办的 2025(第五届)数字化转型发展大会在京举行。会上,“阿里云应用服务器软件 AliEE”、“消息队列软件 RocketMQ”、“云数据库 Tair”三款产品成功通过中国信通院“安全可信中间件”系列评估,成为首批获此认证的中间件产品。此次评估覆盖安全可信要求、功能完备性、安全防护能力、性能表现、可靠性与可维护性等核心指标,标志着阿里云中间件产品在多架构适配与安全能力上达到行业领先水平。
303 192
|
3天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
357 167
|
2天前
|
开发者
「玩透ESA」ESA启用和加速-ER在加速场景中的应用
本文介绍三种配置方法:通过“A鉴权”模板创建函数并设置触发器路由;在ESA上配置回源302跟随;以及自定义响应头。每步均配有详细截图指引,帮助开发者快速完成相关功能设置,提升服务安全性与灵活性。
305 2
|
8天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
458 93