【力扣: 15题: 三数之和】

news2024/9/21 2:35:40

15题: 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

【思路1】

首先对数组进行排序

题目等效于: 求 X + Y + Z = 0 , X != Y  != Z 

而且数组中元素又不可以重复, 那么我们可以认为 三个元素的大小顺序 就是  X <= Y <= Z 

那么可以理解 , X 就是3个元素中,最小的, 如果存在,则一定满足
X <= 0 , 且 Z >= 0 

并且当 X= 0 , 那么一定是 Y=0,且 Z=0 这一种情况。

那么可以根据 X+Y 的值 去Z中找 Z = -(X+Y)

在第2层for循环中,利用二分查找,进行优化,而不是开启第三层for循环。

(如果第三层直接 for循环, 则会超时~)

解答:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
 * <p>
 * 你返回所有和为 0 且不重复的三元组。
 */
public class Solution {
    // 第3层循环改为2分查找
    public List<List<Integer>> threeSum(int[] nums) {
        // 默认 x , y, z 由小到大
        List<List<Integer>> list = new ArrayList<>();

        // 1. 对数组进行排序
        Arrays.sort(nums);
        // 2. 进行遍历
        for (int i = 0; i < nums.length; i++) {
            // 如果x>0,则直接结束for循环
            if (nums[i] > 0) {
                break;
            }
            if (i >= 1 && nums[i] == nums[i - 1]) {
                continue;
            }
            for (int j = i + 1; j < nums.length; j++) {
                if (j >= 2 && (j - 1 > i) && nums[j] == nums[j - 1]) {
                    continue;
                }

                // 用二分查找, 查找是否存在 值为  -(nums[i]+nums[j]) 的值
                // 初始下标 k=j+1 , 终止下标: k=nums.length-1 , 且有序
                int start = j+1 ;
                int end = nums.length-1;
                int index = twoSplitSearch(nums, start, end, -(nums[i] + nums[j]));
                if (index<0){
                    continue;
                }
                List<Integer> integers = Arrays.asList(nums[i], nums[j], nums[index]);
                list.add(integers);
            }
        }
        return list;
    }

    // 二分查找
    public static int twoSplitSearch(int[] ints,int startIndex, int endIndex,int target ){
        int result = -1;
        if (startIndex>endIndex){
            return result;
        }
        int mid = (startIndex+endIndex)/2;
        while (ints[mid]!=target && startIndex<endIndex){
            if (target > ints[mid]){
                startIndex=mid+1;
            }else {
                endIndex=mid-1;
            }
            mid=(startIndex+ endIndex)/2;
        }
        if (ints[mid]==target && mid>=startIndex){
            result=mid;
        }
        return result;
    }
}

自己记录这个解法也只是刚刚通过, 还是很慢, 后面再更新更好的解法。

------------------ 更新-------------------------2024-07-07 --------------------------

【思路3】

同样借助上面思路1的思想, 如果我们对仅仅根据 X 去找另外的2个值  Y, Z, 那样就只要一个for循环,利用双指针的思想。

同样,当 X > 0 即可结束最外层的for循环。

如图所示:

在这里插入图片描述

public class Solution {

    public static void main(String[] args) {
        Solution solution = new Solution();
        List<List<Integer>> list = solution.threeSum(new int[]{-4, -2, -2, -2, 0, 1, 2, 2, 2, 3, 3, 4, 4, 6, 6});
        System.out.println(list);
    }

    // 时间复杂度是 o(n^2)
    public List<List<Integer>> threeSum(int[] nums) {
        // 默认 x , y, z 由小到大
        List<List<Integer>> list = new ArrayList<>();
        // 1. 对数组进行排序
        Arrays.sort(nums);
        // 2. 进行遍历
        for (int i = 0; i < nums.length; i++) {
            // 如果x>0,则直接结束for循环
            if (nums[i] > 0) {
                break;
            }
            if (i >= 1 && nums[i] == nums[i - 1]) {
                continue;
            }

            int left = i + 1;
            int right = nums.length - 1;

            while (left < right) {
                int total = nums[left] + nums[right];
                // 去重判断
                if (left - 1 > i && nums[left - 1] == nums[left]) {
                    left++;
                    continue;
                }
                // 去重判断
                if (right < nums.length - 1 && nums[right] == nums[right + 1]) {
                    right--;
                    continue;
                }
                if (total == -nums[i]) {
                    // 采集结果
                    List<Integer> result = new ArrayList<>();
                    result.add(nums[i]);
                    result.add(nums[left]);
                    result.add(nums[right]);
                    list.add(result);
                    // 那下一步到底是移动左还是右呢?
                    // 尝试左移?
                    // 尝试右移?
                    // 直接左移有指针, 或者右移左指针都可以
//                    left++;
                    right--;
                } else if (total > -nums[i]) {
                    right--;
                } else {
                    left++;
                }
            }
        }
        return list;
    }
}

到此结束 ~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1907392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

回归损失和分类损失

回归损失和分类损失是机器学习模型训练过程中常用的两类损失函数&#xff0c;分别适用于回归任务和分类任务。 回归损失函数 回归任务的目标是预测一个连续值&#xff0c;因此回归损失函数衡量预测值与真实值之间的差异。常见的回归损失函数有&#xff1a; 均方误差&#xff…

参考人物和背景生成惊艳图片,comfyui风格工作流!

前言 轻松使用ComfyUI生成惊艳图片&#xff1a;快速指南 在这篇文章中&#xff0c;我们将分享如何使用ComfyUI工作流轻松生成高质量的图像。这一过程不仅适合专业的设计师&#xff0c;同样也适用于刚开始接触图像生成技术的用户。通过本文&#xff0c;你将了解如何利用ComfyU…

CSS--表格自适应宽度并设置最小宽度

原文网址&#xff1a;CSS--表格自适应宽度并设置最小宽度_IT利刃出鞘的博客、-CSDN博客 简介 本文介绍怎样让HTML的表格自适应宽度。 Java技术星球&#xff1a;way2j.com 问题描述 默认样式下&#xff0c;表格会出现某一列很窄的情况&#xff1a; 代码&#xff1a; <h…

Function Call ReACT,Agent应用落地的加速器_qwen的function calling和react有什么不同

探索智能体Agent的未来之路&#xff1a;Function Call与ReACT框架的较量&#xff0c;谁能引领未来&#xff1f; 引言 各大平台出现智能体应用创建&#xff0c;智能体逐渐落地&#xff0c;背后的使用哪种框架&#xff1f; 随着各大平台&#xff0c;例如百度千帆APPbuilder、阿…

Python入门 2024/7/8

目录 数据容器 dict(字典&#xff0c;映射) 语法 定义字典字面量 定义字典变量 定义空字典 从字典中基于key获取value 字典的嵌套 字典的常用操作 新增元素 更新元素 删除元素 清空字典 获取全部的key 遍历字典 统计字典内的元素数量 练习 数据容器的通用操作…

浏览器控制台打印日志的方法汇总

目录 console.table用法 打印数组 打印对象 打印数组对象 打印数组对象里的指定字段 console.count用法 不传参打印 传参打印 console.warn用法 打印文本 打印对象 console.error用法 打印文本 打印对象 console.assert用法 打印文本 打印对象 consol…

ACL 2024|D2LLM:将Causal LLM改造成向量搜索模型的黑科技

语义搜索任务的主要挑战是创建既准确又高效的模型来精准定位与用户查询相关的句子。基于BERT风格的双编码器因为可以使用预先计算的嵌入表示时效率很高&#xff0c;但它们往往会错过句子对的微妙关系。相反&#xff0c;基于 GPT 风格的大语言模型&#xff08;LLM&#xff09;采…

【Python基础篇】条件判断和循环判断

文章目录 1. 条件判断1.1 单分支1.2 双分支1.3 多分支 2. 循环判断2.1 while2.2 for2.3 break2.4 continue 1. 条件判断 1.1 单分支 前面学习了打印&#xff0c;但是有时候我们在打印时会面临选择&#xff0c;例如&#xff1a;一个网吧&#xff0c;未满18&#xff0c;禁止进入…

将QT移植到IMX6ULL开发板

文章目录 前言一、编译系统1.设置交叉编译工具链2.编译系统3.烧写 二、Linux中下载QT1.安装 Qtcreator2.创建第一个程序3.配置 QtCreator 开发环境&#xff08;1&#xff09;打开选项界面&#xff08;2&#xff09;选择编译器&#xff08;3&#xff09;设置编译器&#xff08;4…

【Go】函数的使用

目录 函数返回多个值 init函数和import init函数 main函数 函数的参数 值传递 引用传递&#xff08;指针&#xff09; 函数返回多个值 用法如下&#xff1a; package mainimport ("fmt""strconv" )// 返回多个返回值&#xff0c;无参数名 func Mu…

数组算法(二):交替子数组计数

1. 官方描述 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 1&#xff1a; 输入&#xff1a; nums [0,1,1,1] 输出&#xff1a; 5 解释&#…

年销量超1亿箱,三得利BOSS咖啡如何凭借人群战略打造极致产品力?

BOSS咖啡诞生于1992年&#xff0c;在可口可乐、朝日、麒麟等饮料巨头先后入局&#xff0c;市场竞争非常激烈的情况下&#xff0c;BOSS咖啡成为受国民欢迎的品牌&#xff0c;它是如何做到的呢? 罐装咖啡趋势崛起&#xff0c;各大品牌推出罐装咖啡 自1980年代起&#xff0c;罐装…

大语言模型的应用探索AI Agent初探!

前言 大语言模型的应用之一是与大语言模型进行聊天也就是一个ChatBot&#xff0c;这个应用已经很广泛了。 接下来的一个应用就是AI Agent。 AI Agent是人工智能代理&#xff08;Artificial Intelligence Agent&#xff09;的概念&#xff0c;它是一种能够感知环境、进行决策…

PL/SQL安装+汉化教程

PL/SQL安装教程 一、安装&#xff1a; 登陆官网&#xff1a;PL/SQL Developer - Allround Automations下载 下载PL/SQL稳定版本12.0.7 根据自己计算机版本安装相适配的版本。我这里安装X64-bit版本 进行安装&#xff1a; 根据情况去更改安装&#xff0c;我这里全部下一步…

服务注册Eureka

目录 一、背景 1、概念 2、CAP 理论 3、常见的注册中心 二、Eureka 三、搭建 Eureka Server 1、搭建注册中心 四、服务注册 五、服务发现 六、Eureka 和 Zooper 的区别 一、背景 1、概念 远程调用就类似于一种通信 例如&#xff1a;当游客与景区之间进行通信&…

代码随想录-Day51

115. 不同的子序列 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 示例 1&#xff1a; 输入&#xff1a;s “rabbbit”, t “rabbit” 输出&#xff1a;3 解释&#xff1a; 如下所示, 有 3 种可以从 …

【SMPL简介】SMPL: A Skinned Multi-Person Linear Model【源码复现】

【SMPL简介】SMPL: A Skinned Multi-Person Linear Model【源码复现】 一、前言环境搭建运行demo.py 参考链接 一、前言 SMPL是一种3D人体建模方法.在数字人或者人物角色三维重建领域有着广泛应用 支持人体的各种形状及动作 可以简单理解为通过训练获取的人物模型 常用的模型有…

信息技术课堂纪律管理:从混乱到秩序的智慧转型

引言&#xff1a; 在信息爆炸的时代&#xff0c;信息技术课程如同一把开启未来世界大门的钥匙&#xff0c;为学生们搭建起探索科技奥秘的桥梁。然而&#xff0c;面对着屏幕背后的无限诱惑&#xff0c;维持课堂纪律&#xff0c;确保学生们专注于学习&#xff0c;成为了每位信息…

Flask项目搭建及部署 —— Python

flask搭建及部署 pip 19.2.3 python 3.7.5 Flask 1.1.1 Flask-SQLAlchemy 2.4.1 Pika 1.1.0 Redis 3.3.11 flask-wtf 0.14.2 1、创建flask项目&#xff1a; 创建完成后整个项目结构树&#xff1a; app.py: 项⽬管理⽂件&#xff0c;通过它管理项⽬。 static: 存放静态…

使用tcpdump抓取本本机的所有icmp包

1、抓取本机所有icmp包 tcpdump -i any icmp -vv 图中上半部分&#xff0c;是源主机tmp179无法ping通目标主机192.168.10.79&#xff08;因为把该主机关机了&#xff09;的状态&#xff0c;注意看&#xff0c;其中有unreachable 图中下半部分&#xff0c;是源主机tmp179可以p…