当前位置: 首页 > news >正文

★ 算法OJ题 ★ 力扣15 - 三数之和

Ciallo~(∠・ω< )⌒☆ ~ 今天,芝麻凛将和大家一起做一道双指针算法题--三数之和~

目录

一  题目

二  算法解析

三  编写算法


一  题目

15. 三数之和 - 力扣(LeetCode)

二  算法解析

解法一:排序 + 暴力枚举 + 利用set去重

时间复杂度:O(N^3)

解法二:排序 + 双指针

  • 排序;
  • 固定一个数C(C <= 0);
  • 在该数后面的区间内,利用双指针算法,快速找两个数的和为 -C。

这道题⾥⾯需要有去重操作~

  • 找到⼀个结果之后, left 和 right 指针要跳过重复的元素
  • 当使⽤完⼀次双指针算法之后,固定的 C 也要跳过重复的元素

三  编写算法

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums){vector<vector<int>> ret; // 存放结果的顺序表~sort(nums.begin(), nums.end());  // 排序~int n = nums.size();// 固定数ifor (int i = 0; i < n; ) // i的变化需要跳过相同的数,放后面写~{if (nums[i] > 0) // 小优化,三个大于0的数加起来不可能等于0~break;int left = i + 1, right = n - 1, target = -nums[i];while (left < right){// 两数之和int sum = nums[left] + nums[right];if (sum == target){ret.push_back({ nums[i], nums[left], nums[right] });left++;right--;// 去重,left right 跳过相同数,但不能越界while (left < right && nums[left] == nums[left - 1])left++;while (left < right && nums[right] == nums[right + 1])right--;}if (sum < target)left++;if (sum > target)right--;}i++;// 去重,i 跳过相同数,但不能越界while (i < n && nums[i] == nums[i - 1])i++;}return ret;}
};


http://www.mrgr.cn/news/17222.html

相关文章:

  • BP神经网络学习内容分享:前向传播与后向传播
  • watchdog: BUG: soft lockup
  • 概率论与数理统计
  • TCP的流量控制深入理解
  • C语言程序设计之基础易错题锦集6
  • 百度 AI Studio 脚本任务篇,它不同于notebook任务是支持免费的, 脚本任务是需要算力卡的,更好的算力 支持四张显卡,
  • 如何打造Java SpringBoot宿舍设备管理系统,全程跟踪设备使用周期,2025最新设计指南
  • CompletableFuture实战
  • 基于matlab的行人和车辆检测系统
  • Python在人工智能方面的应用
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇你就是网络安全高手了。
  • 4家国产数据库上市公司:最好的盈利1个亿,最惨亏8000w
  • 设计模式与反模式:UML图示常见误用案例分析
  • 生信机器学习入门4 - scikit-learn训练逻辑回归(LR)模型和支持向量机(SVM)模型
  • OutOfMemoryError
  • Docker 镜像
  • 编程效率进阶:打造你专属的 Git 别名与 PyCharm 完美结合
  • 代码随想录算法训练营第32天 | 509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
  • MarkDown教程
  • C# 去掉字符串最后一个字符的5种方法