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

力扣15:三数之和

力扣15:三数之和

  • 题目
  • 思路
  • 代码

题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

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

思路

如果仅仅是三数之和那我们可以和两数之和相同使用嵌套循环来得到三元组解,但是题目特意要求了不可以包含重复的三元组,如果只是两个数我们还可以使用哈希表来排除重复的二元组。但三元组我们就不好使用哈希来排除重复解了并且三次嵌套的时间复杂度太高了也不好使用。那我们是否可以将三次嵌套改成二次嵌套呢?也就是我们使用一层循环确认一个数再用第二层循环确定另外两个数,第一层循环好说我们直接遍历数组即可也就可以确定一个数主要是第二层循环要如何确定两个数呢?观察题目我们发现数组是无序的这也就导致我们对重复解的排查工作很难进行,那么我们是否可以将数组进行排序,这样我们在第一层里确定了第一个数在第二层里只要使用双指针即一个指向第一个数的后一位一个指向数组的最后一位,再通过对三数相加与0的比较就可以确定三元组的解。而且在排序了之后我们就可以直接跳过与当前值相同的位置了。

代码

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;int n = nums.size();if (n < 3) {return res;}// 排序sort(nums.begin(), nums.end());//第一层循环// 第一个数for (int i = 0; i < n; i++) {// 因为已经排序了如果第一个数都大于0// 那么就没有解了if (nums[i] > 0) {return res;}//如果i的当前值等于i-1的值就跳过//因为会导致重复解if (i > 0 && nums[i] == nums[i - 1]) {continue;}// 第二个数int left = i + 1;// 第三个数int right = n - 1;//第二层循环//left要始终小于rightwhile (left < right) {//如果三个数相加等于0,就得出一个三元组解if (nums[i] + nums[left] + nums[right] == 0) {vector<int> three_nums;three_nums.push_back(nums[i]);three_nums.push_back(nums[left]);three_nums.push_back(nums[right]);res.push_back(three_nums);//循环判断left的下一个位置的值是否等于当前值//避免重复解while (left < right && nums[left] == nums[left + 1]) {left++;}//与left相同,避免重复解while (left < right && nums[right] == nums[right - 1]) {right--;}//left和right的下一个位置的值和当前值不重复//就一个++一个--left++;right--;//如果三数相加小于0就说明left小了//因为第一个数是固定的,只能移动left和right//又因为数组已经进行排序了} else if (nums[i] + nums[left] + nums[right] < 0) {left++;//大于0了就让right--} else {right--;}}}return res;}
};
http://www.dtcms.com/a/290000.html

相关文章:

  • 【洛谷】The Blocks Problem、合并两个有序数组,补充pair(vector相关算法题p2)
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十八课——图像膨胀的FPGA实现
  • “融合进化,智领未来”电科金仓引领数字化转型新纪元
  • Flutter和Kotlin的对比
  • 【用unity实现100个游戏之34】使用环状(车轮)碰撞器(Wheel Collider)从零实现一个汽车车辆物理控制系统,实现一个赛车游戏
  • kotlin和Jetpack Compose对于Android系统来说是什么关系?
  • Python 进阶(七):XML 基本操作
  • opencv无法读取视频
  • Python100个库分享第38个—lxml(爬虫篇)
  • Navicat 17.3 正式发布 | 现已支持达梦、金仓和 IvorySQL 数据库
  • 图片转 PDF三个免费方法总结
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(二)
  • CoolUtils Total PDF Converter:多功能PDF转换专家
  • STM32之GPS定位模块(GT-U8)
  • 合并pdf工具下载
  • Kotlin 高阶函数初步学习
  • k8s的calico无法启动报错解决
  • 集群技术笔记-HAProxy 与 Keepalived 高可用负载均衡实战
  • 如何使用python网络爬虫批量获取公共资源数据实践技术应用
  • 江苏思必驰科技25Java实习面经
  • 杰和科技工业计算机AF208,打造高可靠新能源汽车检测产线
  • Valgrind Cachegrind 全解析:用缓存效率,换系统流畅!
  • 基于springboot+vue+mysql的在线教育系统(源码+论文)
  • 多级缓存(亿级流量缓存)
  • 布局AI +文化新赛道,浙江省文化产业投资集团赴景联文科技调研交流
  • 滚珠导轨:物流输送与包装分拣的“高速轨道”
  • 前端包管理工具深度对比:npm、yarn、pnpm 全方位解析
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pytest’问题
  • Java 实现 TCP 一发一收通信
  • GitHub+Git新手使用说明