【算法笔记】LeetCode_15_三数之和

LeetCode_15_三数之和

LeetCode 15 (LeetCode 15)

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != 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 。

提示:

  • 3 <= nums.length <= 3000
  • -10<sup>5</sup> <= nums[i] <= 10<sup>5</sup>

思路整理

  1. 两数之和问题很好解决,先把数组从小到大排序,然后使用双指针分别从开头和末尾开始移动,如果两个指针对应的值求和大于target,则判断是”大数太大“,则右指针左移,反之则判断”小数太小“,则左指针右移,如果刚好等于target,则把这一对对应的值保存下来,循环结束的条件:1. 左右指针相逢 2. 小数大于target
  2. 其实题目衍生为N数求和,都可以转化成2数求和,其中第一个数是 n u m 1 num_1 num1,第二个数 n u m 2 = n u m 2 + n u m 3 + . . . + n u m n num_2 = num_2 + num_3 + ... + num_n num2=num2+num3+...+numn,使用递归可以完美解决问题
  3. 题目中特别要求的:不能出现重复的组合,则让我们需要在移动指针时注意重复的元素,我们可以在每次移动之前保存一个历史记录,通过这个历史记录判断移动后的值是不是重复的。

代码

twoSum 函数
public:vector<vector<int>> twoSum(vector<int>nums, int start, int target){// 初始化左右指针int left = start;int right = nums.size() - 1;vector<vector<int>> ret;// 如果数组长度不足,直接返回空结果if (right - start < 1){return ret;}// 使用双指针法查找两数之和while(left != right){int sum = nums[left] + nums[right];int his_left = nums[left];int his_right = nums[right];// 如果左边的数大于目标值,说明需要减小左边的数,直接跳出循环if (his_left > target){break;}// 如果当前和大于目标值,右指针向左移动if (sum > target){while(left < right && nums[right] == his_right){right --;}}// 如果当前和小于目标值,左指针向右移动else if (sum < target){while(left < right && nums[left] == his_left){left ++;}}// 如果当前和等于目标值,找到一对解,并移动指针else{vector<int> match = {nums[left], nums[right]};ret.push_back(match);while(left < right && nums[right] == his_right){right --;}while(left < right && nums[left] == his_left){left ++;}}}return ret;}
threeSum 函数
    vector<vector<int>> threeSum(vector<int>& nums) {// 初始化索引int i = 0;// 对数组进行排序sort(nums.begin(), nums.end());vector<vector<int>> ret;// 使用循环和两数之和的方法找到三数之和while(i < nums.size() - 1){int his_i = nums[i];// 如果当前数大于0,说明后面的数也会大于0,直接跳出循环if (his_i > 0){break;}// 使用两数之和的方法找到剩余两数之和为0-his_i的解vector<vector<int>> two_sum_ret = twoSum(nums, i + 1, (0 - his_i));// 将找到的解添加到结果中for(int j = 0; j < two_sum_ret.size(); j ++){two_sum_ret[j].push_back(his_i);ret.push_back(two_sum_ret[j]);}// 跳过重复的数while(i < nums.size() - 1 && nums[i] == his_i){i ++;}}return ret;}

方法和思想

  • 双指针法:在 twoSum 函数中,通过设置左右指针来找到两数之和。这种方法适用于已排序的数组。
  • 避免重复:在循环中,通过比较当前数和下一个数来避免重复的结果。
  • 排序:在 threeSum 函数中,首先对数组进行排序,这是因为双指针法需要数组是有序的。

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

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

相关文章

北斗卫星助力无人机在沙漠播种,促进沙漠治理

北斗卫星助力无人机在沙漠播种&#xff0c;促进沙漠治理 近年来&#xff0c;随着科技的不断发展&#xff0c;北斗卫星和无人机技术的结合被广泛应用于沙漠治理领域&#xff0c;为解决沙漠化问题提供了全新的思路和解决方案。 近日&#xff0c;黄河“几字弯”北岸的内蒙古自治…

《LeetCode力扣练习》代码随想录——二叉树(完全二叉树的节点个数---Java)

《LeetCode力扣练习》代码随想录——二叉树&#xff08;完全二叉树的节点个数—Java&#xff09; 刷题思路来源于 代码随想录 222. 完全二叉树的节点个数 二叉树-后序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeN…

[力扣100][好题] 121.买股票的最佳时机 || 动态规划

添加链接描述 思路&#xff1a; 设置一个动态数组dp用来存放当前最大的利润这个利润有两个来源&#xff1a;来源一是来自上一个最大利润&#xff1b;来源二是目前值减去最小买入价格如何维护最小值&#xff1f;预设一个最小值然后将这个最小值每次和当前值比较 class Solutio…

word打字后面的字消失是怎么回事

在使用Microsoft Word进行文档编辑时&#xff0c;很多用户可能会遇到一个令人困惑的问题&#xff1a;当在文档中打字时&#xff0c;后面的字却莫名其妙地消失了。这种情况不仅影响了编辑效率&#xff0c;还可能导致重要数据的丢失。那么&#xff0c;这一现象背后的原因是什么&a…

JVM3_数据库连接池虚引用ConnectionFinalizerPhantomReference引起的FullGC问题排查

背景 XOP服务运行期间&#xff0c;查看Grafana面板&#xff0c;发现堆内存周期性堆积&#xff0c;Full GC时间略长&#xff0c;需要调查下原因 目录 垃圾收集器概述 常见的垃圾收集器分区收集策略为什么CMS没成为默认收集器 查看JVM运行时环境分析快照 PhantomReference虚引用…

46. 全排列(力扣LeetCode)

文章目录 46. 全排列题目描述回溯算法 46. 全排列 题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],…

深度学习目标检测】二十二、基于深度学习的肺炎检测系统-含数据集、GUI和源码(python,yolov8)

肺炎尽管很常见&#xff0c;但准确诊断是一项困难的任务。它要求训练有素的专家对胸部X光片进行检查&#xff0c;并通过临床病史&#xff0c;生命体征和实验室检查进行确认。肺炎通常表现为胸部X光片上一个或多个区域的阴影(opacity)增加。但是&#xff0c;由于肺部有许多其他状…

每日OJ题_链表①_力扣2. 两数相加

目录 力扣2. 两数相加 解析代码 力扣2. 两数相加 2. 两数相加 难度 中等 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个…

【Python】创建python库的学习笔记

1. 约定俗成的目录结构 根目录下的setup.py&#xff1a;在根目录下包含一个setup.py文件&#xff0c;用于指定项目的依赖关系、包信息以及其他安装和分发相关的元数据。例如&#xff0c;pyminitouch/setup.py。与库同名的代码目录&#xff1a;建立与库同名的代码文件夹&#x…

二维码门楼牌管理系统应用场景:数据管理的智慧新选择

文章目录 前言一、数据管理部门的智慧工具二、助力决策制定与优质服务提供三、二维码门楼牌管理系统的优势四、展望未来 前言 随着科技的飞速发展&#xff0c;二维码门楼牌管理系统正逐渐成为城市管理的智慧新选择。该系统不仅提升了数据管理效率&#xff0c;还为政府和企业提…

linux中怎么用shell逐行读取文件

在Linux中,可以使用shell脚本逐行读取文件。有多种方法可以实现这个功能,下面是几个常见的方法: 方法一:使用while循环和read命令逐行读取文件 #!/bin/bash file="filename.txt" while IFS= read -r line doecho "$line" done < "$file"…

python并发编程:阻塞IO

阻塞IO&#xff08;blocking IO&#xff09; 在Linux中&#xff0c;默认情况下所有的socket都是blocking&#xff0c;一个典型的读操作流程大概是这样&#xff1a; 当用户进程调用了recvfrom这个系统调用&#xff0c;kernel就开始了IO的第一个阶段&#xff1a;准备数据。对于…

[编码] Base64基础知识

文章目录 Base64编码解码原理参考 Base64编码解码原理 首先有一个64个字符的转换表。 待转转换的数据&#xff0c;3个字节位一组&#xff0c;3个字节24位&#xff0c;刚好可以分成4个6位的对象&#xff0c; 每个6位对象前补2个0&#xff0c;就变成了4个字节。这就可以对应转换…

Python编程作业五:面向对象编程

目录 一、类的定义和方法 二、图书管理系统 一、类的定义和方法 定义一个学生类&#xff08;Student&#xff09;&#xff0c;包括学号(id)、姓名(name)、出生日期(birthday)和分数(score)4个属性&#xff0c;其中出生日期是私有属性&#xff0c;不能被外界直接访问。该类应具…

力扣每日一题 找出字符串的可整除数组 数论

Problem: 2575. 找出字符串的可整除数组 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 灵神题解 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public int[] divisibilityArray(String word, int m){in…

销冠MPV增配不增价,2024款腾势D9正式上市

3月6日&#xff0c;2024款腾势D9正式上市&#xff0c;官方指导价33.98万元起。销冠MPV增配不增价&#xff0c;并推出2000元定金抵扣车辆尾款10000元等上市权益。针对老用户也推出了30000元置换补贴等感恩回馈。 作为腾势汽车破局豪华MPV全品类冠军的扛鼎之作&#xff0c;腾势D9…

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit

1.问题描述 在App中供用户在地图上选择地址&#xff0c;目前在使用Map Kit结合geolocationManager逆地理编码时获取的地址信息描述不准确&#xff0c;希望能提供相应的Demo参考。 解决方案 Demo代码示例&#xff1a; getLocation() { let requestInfo: geoLocationManager.…

异地组网搭建方案

在这个信息爆炸的时代&#xff0c;人与人之间的联系变得越来越密切&#xff0c;而异地组网搭建方案也因此变得越 来越重要。无论是跨国企业、远程学习还是国际合作&#xff0c;构建一个快捷稳定的异地组网系统&#xff0c;已经 成为许多组织和个人不可或缺的需求。接下来&#…

换个角度看禅让制止于禹

前言 在历史课本上&#xff0c;对尧、舜、禹三代君王的描述是&#xff0c;他们在去世之前通过禅让制的方式把自己的王位禅让给了其他有贤明的能臣。 禅让制也是中国古代时期被无数的文人志士追捧的一个制度&#xff0c;因为他们觉得那个时代是公天下的时代。 可实际上自从人…

selenium中ChromeDriver配置,一把过,并且教你伪装

最近正值毕业季&#xff0c;我之前不是写了个问卷星代码嘛&#xff0c;昨晚上有人凌晨1点加我&#xff0c;问我相关内容。 由于我之前C盘重装了一下&#xff0c;导致我很多东西空有其表&#xff0c;实际不能用&#xff0c;借此机会&#xff0c;向大家编写ChromeDriver配置&…