[双指针] 三数之和, 四数之和

news/2024/11/8 17:59:15 标签: 算法, java, leetcode, 面试, intellij-idea, 数据结构

目录

一. LCR 007. 三数之和 - 力扣(LeetCode)

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


一. LCR 007. 三数之和 - 力扣(LeetCode)

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
java">    public List<List<Integer>> threeSum(int[] nums) {
        // 升序数组
        Arrays.sort(nums);
        List<List<Integer>> ret = new ArrayList<>();
        // 双指针 判断两数之和 == 第三个数的负数
        int n = nums.length;
        for (int i = 0; i < n;) {
            int left = i + 1;
            int right = n - 1;
            while (left < right) {
                long sum = nums[left] + nums[right];
                if (sum < -nums[i]) left++;
                else if (sum > -nums[i]) right--;
                else {
                    ret.add(Arrays.asList(nums[left++], nums[right--], nums[i]));
                    // 去重
                    while (left < right && nums[left] == nums[left - 1]) left++;
                    while (left < right && nums[right] == nums[right + 1]) right--;
                }
            }
            i++;
            // 去重
            while (i < n && nums[i] == nums[i - 1]) i++;
        }
        return ret;
    }

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

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]
java">    public List<List<Integer>> fourSum(int[] nums, int target) {
        // 升序数组
        Arrays.sort(nums);
        List<List<Integer>> ret = new ArrayList<>();
        // 双指针 本质上是求三数之和 b + c + d = target - a
        // 而三数之和本质上是求两数之和 c + d = target - a - b
        int n = nums.length;
        for (int i = 0; i < n;) { // 固定数 a
            for (int j = i + 1; j < n;) { // 固定数 b
                int left = j + 1;
                int right = n - 1;
                while (left < right) {
                    long sum = (long)nums[left] + (long)nums[right];
                    if (sum < (long)target - (long)nums[i] - (long)nums[j]) left++;
                    else if (sum > (long)target - (long)nums[i] - (long)nums[j]) right--;
                    else {
                        ret.add(Arrays.asList(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--;
                    }
                }
                j++;
                // 去重
                while (j < n && nums[j] == nums[j - 1]) j++;
            }
            i++;
            // 去重
            while (i < n && nums[i] == nums[i - 1]) i++;
        }
        return ret;
    }


http://www.niftyadmin.cn/n/5744251.html

相关文章

构建可视化站点地图:提升用户体验

在当今数字化时代&#xff0c;可视化站点地图&#xff08;也称为HTML站点地图&#xff09;是一种美观且实用的工具&#xff0c;它不仅帮助用户快速理解网站结构&#xff0c;还为搜索引擎提供了便捷的导航。与传统站点地图不同&#xff0c;HTML可视化站点地图以用户友好和视觉友…

[linux]docker基础

常见命令 Docker最常见的命令就是操作镜像、容器的命令&#xff0c;详见官方文档: Docker Docs 案例: 查看DockerHub&#xff0c;拉取Nginx镜像&#xff0c;创建并运行Nginx容器 在DockerHub中搜索Nginx镜像 拉取Nginx镜像 查看本地镜像列表 把镜像保持到本地 查看保持命令的…

Docker如何以配置文件方式安装nginx

目录 1 准备挂载目录 2 拉去nginx镜像 3 启动命令 1 准备挂载目录 mkdir -p /temp/nginx/html #创建nginx的html挂载目录 mkdir -p /temp/nginx/conf #创建nginx的配置文件挂载目录 自定义nginx配置文件 放在conf目录下 #user nobody; worker_processes 1;#error_log l…

Java智慧养老养老护理帮忙代办陪诊陪护平台系统小程序源码

&#x1f31f; 智慧养老新时代&#xff1a;养老护理、帮忙代办、陪诊陪护平台系统全解析 &#x1f3e1; &#x1f475; 引言&#xff1a;智慧养老&#xff0c;让爱无距离 随着科技的飞速发展&#xff0c;智慧养老已成为新时代老年人的新选择。通过养老护理、帮忙代办、陪诊陪护…

数据结构——线性表与链表

看了一下其他链接&#xff0c;真正的循序表应该支持随机索引的&#xff0c;也就是new的时候就将内存分配好。 这里是像链表一样申请了&#xff0c;当做链表看吧 参考链接&#xff1a;数据结构与算法——顺序表和链表的优缺点&#xff08;区别、特点&#xff09;详解_顺序表和…

qt QHttpMultiPart详解

1. 概述 QHttpMultiPart是Qt框架中用于处理HTTP多部分请求的类。它类似于RFC 2046中描述的MIME multipart消息&#xff0c;允许在单个HTTP请求中包含多个数据部分&#xff0c;如文件、文本等。这种多部分请求在上传文件或发送带有附件的邮件等场景中非常有用。QHttpMultiPart类…

机器学习中的两种主要思路:数据驱动与模型驱动

在机器学习的研究和应用中&#xff0c;如何从数据中提取有价值的信息并做出准确预测&#xff0c;是推动该领域发展的核心问题之一。在这个过程中&#xff0c;机器学习方法主要依赖于两种主要的思路&#xff1a;数据驱动与模型驱动。这两种思路在不同的应用场景中发挥着至关重要…

边缘计算的基本概念与实践

在物联网&#xff08;IoT&#xff09;领域&#xff0c;边缘计算正逐渐成为一种重要的技术趋势。随着设备数量的激增和数据量的不断增加&#xff0c;传统的集中式云计算模式已经难以满足实时性、数据安全性和带宽效率的需求。边缘计算通过将计算资源下沉到网络边缘&#xff0c;靠…