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

Leetcode15. 三数之和(HOT100)

链接

一般这种三数之和,四数之和都使用双指针,复杂度最优,次一级可使用哈希表。前者要求有序,后者空间上有花费。

题目:

题目要求答案中不能出现重复vector,比如{-1 1 0}和{-1 0 1};

这两个在固定住i 指向0位置,然后在后续子数组中查找合适的j 和k 时,会出现重复,所以我们对数组排序,通过if语句解决重复问题。

我们要找nums[i]+num[j]+nums[k]==0,乍一看,需要三个指针,三种循环来判断,但这显然是不合适的,于是我们固定住i(也就是让i从开头遍历到结尾即可),然后让j 从i 后面开始,k从最后一个元素开始往中间遍历。

如果刚开始(也就是图中这个位置),三个相加都小于0,那么就不存在答案,因为我们的数组是有序的,k越往做,越小了。

所以,我们只需要找三个相加大于等于0的,这样越往前越有可能找到==0的情况。

为什么要一直往前呢?万一出现下图这样,k指向的值刚好就可以和nums[i] nums[j]相加为0,为何还要往前?

因为我们怕重复,{-2 0 2},{-2 0 2},{-2 0 2},{-2 0 2}...........这不符合题目要求,所以我们尽量往左走,只留一个就行了。

另外,代码中其实还有可以优化的地方:

也就是这两点,因为排序后,并不能去重,所以会出现:

i指向这两个位置,找到的答案还是会重复,所以我们在i 至少找过一次(也就是i!=0即 i)时,且nums[i]==nums[i-1]时,continue住,不要往下循环了,别找了,答案如果有都是一样的,没必要循环了。

还有j 的情况也是如此:j>i+1也就是j 在当前i 这个位置至少已经找过一次了,如果j 往后挪了还是相等,那也不用找了。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); i++) {if (i && nums[i] == nums[i - 1]) // if (i + 1 < nums.size() &&// nums[i] == nums[i + 1])continue;for (int j = i + 1, k = nums.size() - 1; j < k; j++) {if (j > i + 1 &&nums[j] == nums[j - 1]) // if (j + 1 < nums.size() &&// nums[j] == nums[j + 1])continue;while (k - 1 > j && nums[j] + nums[k - 1] + nums[i] >= 0)--k;if (nums[i] + nums[j] + nums[k] == 0) {res.push_back({nums[i], nums[j], nums[k]});}}}return res;}
};

http://www.lryc.cn/news/499543.html

相关文章:

  • Oracle数据库小白备忘
  • DDR4与DDR3服务器内存的关键区别有哪些?
  • Linux: shell: bash: set -x;调试使用
  • Hadoop生态圈框架部署 伪集群版(五)- HBase伪分布式部署
  • 自定义指令,全局,局部,注册
  • 静坐修心.
  • 设计模式c++(一)
  • 核密度估计——从直方图到核密度(核函数)估计_带宽选择
  • Vant UI Axure移动端元件库:提升移动端原型设计效率
  • 如何用 JavaScript 操作 DOM 元素?
  • 【Ubuntu】URDC(Ubuntu远程桌面助手)安装、用法,及莫名其妙进入全黑模式的处理
  • ES-DSL查询
  • npm 设置镜像
  • SpringMvc完整知识点一
  • STM32G4系列MCU双ADC多通道数据转换的应用
  • 【工具】音频文件格式转换工具
  • ssl证书过期,nginx更换证书以后仍然显示过期证书
  • 原型模式(Prototype Pattern)——对象克隆、深克隆与浅克隆及适用场景
  • 从工标网网站解析标准信息
  • 如何在MySQL中开启死锁日志及查看日志
  • VCP-CLIP A visual context prompting modelfor zero-shot anomaly segmentation
  • 分类算法中的样本不平衡问题及其解决方案
  • 博物馆导览系统方案(一)背景需求分析与核心技术实现
  • [创业之路-169]:《BLM战略规划》- 战略洞察 (战略能力中最最核心的能力) - 市场洞察 -1- 看宏观/行业 - 行业:激光器行业的详细分析
  • 抽象工厂模式的理解和实践
  • WIDER FACE数据集转YOLO格式
  • 项目启动的基本配置
  • Ubuntu桌面突然卡住,图形界面无反应
  • Next.js系统性教学:拦截路由与路由处理器
  • Python编码风格