C++算法练习-day18——15.三数之和

server/2024/10/25 5:41:07/

题目来源:. - 力扣(LeetCode)

题目思路分析

题目描述
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有独特三元组,并返回所有独特三元组的列表。注意:答案中不可以包含重复的三元组。

解题思路

  1. 排序:首先对数组进行排序,这样可以方便后续的查找和去重。
  2. 固定一个数:遍历数组,固定一个数 nums[i],然后使用双指针法查找另外两个数 nums[j] 和 nums[k],使得 nums[i] + nums[j] + nums[k] = 0。
  3. 双指针法
    • 初始化两个指针,左指针 j = i + 1,右指针 k = n - 1。
    • 计算三数之和,根据和的大小调整指针位置:
      • 如果和小于 0,则左指针右移,增加和的值。
      • 如果和大于 0,则右指针左移,减少和的值。
      • 如果和等于 0,则找到了一个解,将结果添加到答案中,并移动指针以避免重复解。
  4. 去重:在遍历过程中,如果当前元素与前一个元素相同,则跳过,以避免重复解。

代码:

#include <vector>  
#include <algorithm>  class Solution {  
public:  std::vector<std::vector<int>> threeSum(std::vector<int>& nums) {  std::vector<std::vector<int>> ans;  int n = nums.size();  // 对数组进行排序  std::sort(nums.begin(), nums.end());  // 遍历数组,固定一个数  for (int i = 0; i < n - 2; ++i) {  // 去重:如果当前元素与前一个元素相同,则跳过  if (i > 0 && nums[i] == nums[i - 1]) {  continue;  }  // 初始化右指针  int k = n - 1;  // 使用双指针法查找另外两个数  for (int j = i + 1; j < n - 1; ++j) {  // 去重:如果当前元素与前一个元素相同,则跳过  if (j > i + 1 && nums[j] == nums[j - 1]) {  continue;  }  // 调整右指针位置,直到找到满足条件的三数之和  while (j < k && nums[i] + nums[j] + nums[k] > 0) {  --k;  }  // 如果左指针与右指针相遇,则结束内层循环  if (j == k) {  break;  }  // 如果找到满足条件的三数之和,则添加到答案中  if (nums[i] + nums[j] + nums[k] == 0) {  ans.push_back({nums[i], nums[j], nums[k]});  }  }  }  return ans;  }  
};

知识点摘要

  1. 排序算法:使用排序算法(如快速排序、归并排序)对数组进行排序,以便后续操作。
  2. 双指针法:在有序数组中使用双指针法查找满足条件的元素,可以提高查找效率。
  3. 去重处理:在遍历过程中,通过比较当前元素与前一个元素是否相同,来避免重复解。

本题通过排序和双指针法,有效地解决了在数组中找到所有独特三元组的问题,使得三数之和为零。排序使得数组有序,从而可以使用双指针法进行高效的查找。同时,通过去重处理,避免了重复解的出现。这种解题思路不仅适用于本题,还可以扩展到其他类似的查找问题中,如四数之和、五数之和等。通过排序和双指针法的结合,可以大大提高查找效率,减少时间复杂度。


http://www.ppmy.cn/server/134620.html

相关文章

Android 13 SPRD 如何临时修改 Android 系统版本

在 Android 开发或调试过程中,有时需要临时修改系统版本号,例如为了适应特定的应用需求或进行特定版本的兼容性测试。通过修改 Android 系统的构建文件,可以轻松实现这个目的。本文将介绍如何在 Android 源码中快速更改系统版本号。 步骤一:修改 sysprop.mk 首先,我们需…

C++ 虚函数问题理解[虚函数指针位于内存哪里]

虚函数是我们在C开发中最基本的多态中 常用的东西那么对于以下代码看看是否有哪些问题呢? class Base { public:virtual void foo() {printf("Base foo\n");} };void overwriteVtable() {Base obj;memset(&obj, 0, sizeof(obj)); obj.foo(); } 现在大家应该…

用Python将Office文档(Word、Excel、PowerPoint)批量转换为PDF

在处理不同格式的Office文档&#xff08;如Word、Excel和PowerPoint&#xff09;时&#xff0c;将其转换为PDF格式是常见的需求。这种转换不仅确保了文件在不同设备和操作系统间的一致性显示&#xff0c;而且有助于保护原始内容不被轻易修改&#xff0c;非常适合于正式报告、提…

初识jsp

学习本章节前建议先安装Tomcat web服务器&#xff1a;tomcat下载安装及配置教程_tomcat安装-CSDN博客 1、概念 我的第一个JSP程序&#xff1a; 在WEB-INF目录之外创建一个index.jsp文件&#xff0c;然后这个文件中没有任何内容。将上面的项目部署之后&#xff0c;启动服务器…

Java八股文-Mysql

Mysql&#xff1a; 1.Mysql数据库索引的类型有哪些&#xff1f; 普通索引唯一索引主键索引全文索引组合索引 2.主键索引&#xff0c;唯一索引区别&#xff1a; 唯一索引列允许空值&#xff0c;而主键列不允许空值 &#xff08;MySQL 允许在唯一索引列中包含多个 NULL 值&am…

python-PyQt项目实战案例:制作一个视频播放器

文章目录 1. 关键问题描述2. 通过OpenCV读取视频/打开摄像头抓取视频3. 通过PyQt 中的 QTimer定时器实现视频播放4. PyQt 视频播放器实现代码参考文献 1. 关键问题描述 在前面的文章中已经分享了pyqt制作图像处理工具的文章&#xff0c;也知道pyqt通过使用label控件显示图像的…

RK3588开发笔记-麦克风阵列多pdm通道合并成一个声卡

目录 前言 一、RK3588音频架构概述 二、PDM简介 PDM基本原理 PDM的工作流程 PDM接口信号 三、原理图连接 四、设备树配置 五、设备调试 总结 前言 在音频设备的开发中,特别是在多通道音频数据处理场景中,如何将多个PDM(Pulse Density Modulation)通道整合成一个声卡…

DDD和DSSA

DDD(Domain-Driven Design)和DSSA(Domain-Specific Software Architecture)是两种与软件设计和架构相关的方法论。它们各自有不同的焦点和应用场景。下面是对它们的简要介绍和比较: 1. DDD(Domain-Driven Design) 定义:DDD是一种软件设计理念,旨在通过深刻理解业务领…