博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三数之和[LeetCode-15]
阅读量:5844 次
发布时间:2019-06-18

本文共 1167 字,大约阅读时间需要 3 分钟。

思路分析

  • 三数之和,可以转化为两数之和的问题,依次遍历原数组,比如当前遍历到index为5的元素,只要另外两个值相加为0减nums[5]即可。而这两个值对应的下标假设分别为left和right,right即为nums.size()-1,left不需要从0开始,因为在遍历5之前,先遍历的0-4,因此如果在0-4有符合条件的,在遍历0-4时,5已经作为一个结果放进结果数组里了,因为不需要有重复的结果,所以left从index+1开始。
  • 另外,如果相邻的2个值是一样的,则忽略,因为如果相等,意味着如果结果包含这两个值,则结果只需要保留先遍历到的即可,比如原数组为[-1, -1, 0, 1, 2],结果为[-1, -1, 2],很明显遍历index 0时,因为结果包含连续的两个-1,则遍历index 1时,只需要判断与前一个相等,即可继续前进,忽略当前值。

代码实现

class Solution{
public: vector
> threeSum(vector
& nums) { // 先排序 sort(nums.begin(), nums.end()); vector
> res; for (int i = 0; i < nums.size(); i++) { // 判断原因见上面解释的第二条 if (i != 0 && nums[i] == nums[i - 1]) continue; int dst = -1 * nums[i]; // nums[i]为基准值,因此left从i+1开始 int left = i + 1, right = nums.size() - 1; while (left < right) { int sum = nums[left] + nums[right]; if (sum == dst) { res.push_back(vector
{nums[i], nums[left], nums[right]}); left++; while (left < right && nums[left] == nums[left - 1]) { left++; } right--; while (left < right && nums[right] == nums[right + 1]) { right--; } } else if (sum > dst) { right--; } else { left++; } } } return res; }};复制代码

转载地址:http://ashcx.baihongyu.com/

你可能感兴趣的文章
批量修改Mysql数据库表MyISAM为InnoDB
查看>>
机房收费系统之余额查询
查看>>
cacti安装文档
查看>>
awk工具
查看>>
keepalived工作原理
查看>>
使用安全的Windows磁盘格式
查看>>
常见兼容性问题?
查看>>
一个重复try语句的实验
查看>>
Servlet进阶API
查看>>
我和ip_conntrack不得不说的一些事
查看>>
【web安全】跨站攻击思路整理
查看>>
数据库学习笔记-20170309
查看>>
机房收费系统之子窗体不显示问题
查看>>
疯狂ios讲义疯狂连载之显示动画
查看>>
对于大型数据库重新组织数据和生成索引进行维护的建议
查看>>
Windows Phone 7 Tips (8)
查看>>
Kafka、RabbitMQ、RocketMQ等消息中间件的对比 —— 消息发送性能和优势
查看>>
草根IT江湖路之三:希望,在坚持之中
查看>>
从传统运维到云运维演进历程之软件定义存储(六)完结
查看>>
数独暴力遍历代码
查看>>