力扣--双指针15.三数之和

2024-06-01 19:44
文章标签 指针 15 力扣 三数

本文主要是介绍力扣--双指针15.三数之和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

详细思路

  1. 排序数组:首先对数组 nums 进行排序,目的是为了方便后续使用双指针查找和避免重复结果。
  2. 遍历数组:使用一个 for 循环从头遍历到倒数第三个元素。i 表示当前固定的元素。
    • 跳过重复元素:如果当前元素 nums[i] 与前一个元素相同,则跳过,避免重复结果。
    • 提前结束循环:如果当前元素 nums[i] 大于0,因为数组已经排序,后面的元素也都大于0,不可能存在满足条件的三元组,直接结束循环。
  3. 双指针查找:对于每个固定的元素 nums[i],使用双指针在其后的子数组中查找两个数 nums[j]nums[k],使得它们的和为 -nums[i]
    • 调整指针:根据当前三数之和调整双指针的位置:
      • 如果和大于0,说明右边的数太大,右指针 k 左移。
      • 如果和小于0,说明左边的数太小,左指针 j 右移。
      • 如果和等于0,则找到一个满足条件的三元组,将其加入结果,并跳过重复的元素。
  4. 返回结果:所有符合条件的三元组都存储在 result 中,最终返回该结果。

通过这种方法,可以在时间复杂度为 O(n^2) 的情况下找到所有不重复的满足条件的三元组。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result; // 用于存储结果三元组int n = nums.size();if (n <= 2)return result; // 如果数组长度小于等于2,不可能有满足条件的三元组,直接返回空结果sort(nums.begin(), nums.end()); // 将数组排序// 遍历数组,每次固定一个元素for (int i = 0; i <= n - 3; i++) {if (i > 0 && nums[i] == nums[i - 1]) {continue; // 跳过重复的元素,以避免结果中有重复的三元组}if (nums[i] > 0)break; // 如果当前固定的数大于0,由于数组已经排序,后面的数也大于0,不可能找到满足条件的三元组int j = i + 1, k = n - 1; // 初始化双指针,一个从左边开始,一个从右边开始while (j < k) {int sum = nums[i] + nums[j] + nums[k];if (sum > 0) {k--; // 如果三数之和大于0,移动右指针向左} else if (sum < 0) {j++; // 如果三数之和小于0,移动左指针向右} else {// 找到一个满足条件的三元组result.push_back({nums[i], nums[j], nums[k]});// 跳过重复的元素while (j < k && nums[j] == nums[j + 1]) j++;while (j < k && nums[k] == nums[k - 1]) k--;j++;k--;}}}return result; // 返回结果}
};

这篇关于力扣--双指针15.三数之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021946

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)

-------------------------------特别说明--------------------------------------- 视频广告问题:因Adblock Plus的局限,存在以下现象,优酷、搜狐、17173黑屏并倒数;乐视、爱奇艺播放广告。因为这些视频网站的Flash播放器被植入了检测代码,而Adblock Plus无法修改播放器。 如需同时使用ads

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。