LeetCode第18题四数之和

简介: 该文章介绍了 LeetCode 第 18 题四数之和的解法,与三数之和类似,通过先排序,再用双指针确定坐标并去重的方式解决,关键是确定四个坐标,前两个通过两层循环确定,后两个通过首尾双指针确定,同时总结了双指针可减少循环次数,使解决方式更简单高效。

继续打卡算法题,今天学习的是LeetCode的第18题四数之和,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些帮助。

image.png

分析一波题目

四数之和和之前的三数之和可以使用一样的解法

先排序,再用双指针,同时需要去重

因为排序了,去重复就变得容易了。

解题的关键是需要确定4个坐标,前面两个我们通过两层循环确定,后面两个通过首尾双指针来确定。

编码解决

class Solution {
   
   
    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++) {
   
   
            //去重复
            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) {
   
   
                    int sum = nums[i] + nums[j] + nums[left] + nums[right];
                    if (sum > target) {
   
   
                        right--;
                    } else if (sum < target) {
   
   
                        left++;
                    } 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;
    }
}

总结

双指针可以去除循环的次数,解决问题的方式更加简单高效,和3数之和一样,通过首尾的双指针法确定后面两个数字的下标。

相关文章
|
JavaScript 前端开发 数据库
让你少踩坑的fastadmin教程(3)
让你少踩坑的fastadmin教程
1972 0
让你少踩坑的fastadmin教程(3)
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
777 0
Leetcode第三题(无重复字符的最长子串)
|
测试技术 Linux 网络安全
【App Services】App Service报错远程证书无效 - "The remote certificate is invalid according to the validation procedure"
在开发环境中,新部署的应用(App Service)无法与 Salesforce 的远程端点建立 SSL/TLS 连接,报错显示证书无效。经分析,防火墙启用了 SSL Inspection,插入了私有 CA 签发的中间证书,导致 App Service 无法验证。解决方案包括禁用 SSL Inspection、设置 `WEBSITE_LOAD_ROOT_CERTIFICATES` 环境变量或临时禁用代码中的 SSL 验证(仅限测试环境)。
362 8
|
Java
(稳住心态的帖子)idea启动项目速度突然变慢
这是一篇偏向心态调整的帖子
645 0
|
监控 安全 Java
Java多线程调试技巧:如何定位和解决线程安全问题
Java多线程调试技巧:如何定位和解决线程安全问题
380 2
|
敏捷开发 网络协议 测试技术
|
C++
Leetcode第56题(合并区间)
这篇文章介绍了LeetCode第56题“合并区间”的解题方法,通过排序和贪心策略合并重叠区间,并提供了C++的代码实现。
401 0
Leetcode第56题(合并区间)
|
算法
Leetcode第46题(全排列)
这篇文章介绍了LeetCode第46题“全排列”的解题方法,使用深度优先搜索(DFS)和回溯算法来生成给定数组的所有可能排列。
323 0
Leetcode第46题(全排列)
|
存储 网络协议 算法
[计算机网络(谢希仁 第八版)]第一章 概述(学习复习笔记)
[计算机网络(谢希仁 第八版)]第一章 概述(学习复习笔记)
|
消息中间件 存储 资源调度
订单超时处理的几种方案及分析
描述业务常见的订单超时处理的几种方案及分析
33698 19
订单超时处理的几种方案及分析