LC15-3Sum
时间:2020-05-28
本文章向大家介绍LC15-3Sum,主要包括LC15-3Sum使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
https://leetcode.com/problems/3sum/
给一个数组,要求返回其中所有各不相同的三元组,每个三元组中的三个数相加和为0
O(N2)解法:
本题是Two Sum的进阶版,枚举数组中的数nums[i],然后用O(N)的复杂度在剩下的数中使用Two Sum找到和为-nums[i]的不同组合
先对nums数组进行快速排序(从小到大),开销O(NlogN)
当我们枚举到nums[i]时,使用双指针滑窗,滑窗左端为i+1,右端为n-1,然后将左右两端的值相加,与-nums[i]进行比较
如果和大于-nums[i],则右端向左移,如果和小于-nums[i],则左端向右移,如果和等于-nums[i],则更新当前结果到答案中,然后左右两端同时向内侧移(滑窗两端都需要更新到不同的值才有可能让结果依然相等)
当左右两端相遇后,nums[i]的结果就都考虑完了,i向右移
滑窗的起点从i+1开始而不是从0开始,是因为nums[i]与前面的数所组成的合法三元组,已经在枚举前面的数的时候考虑过了,所以滑窗从i后面开始是正确的
需要注意的是,因为答案要求所有的三元组各不相同,所以上面所有描述的移动操作,都是移动到下一个不同的值,这样就可以保证枚举出的所有结果都是各不相同的
1 class Solution { 2 public: 3 vector<vector<int>> threeSum(vector<int>& nums) { 4 vector<vector<int>> ret; 5 sort(nums.begin(),nums.end()); 6 int n = nums.size(); 7 for (int i = 0; i < n; ) { 8 if (nums[i] > 0) break; 9 int Target = -nums[i]; 10 int low = i + 1, high = n - 1; 11 while (low < high) { 12 if (nums[low] + nums[high] == Target) { 13 int ans[3] = { nums[i] ,nums[low] ,nums[high] }; 14 ret.push_back(vector<int>(ans,ans+3)); 15 16 for (++low; low < n; low++) { 17 if (nums[low] != nums[low - 1]) { 18 break; 19 } 20 } 21 22 for (--high; high >= 0; high--) { 23 if (nums[high] != nums[high + 1]) { 24 break; 25 } 26 } 27 } 28 else if (nums[low] + nums[high] < Target) { 29 for (++low; low < n; low++) { 30 if (nums[low] != nums[low - 1]) { 31 break; 32 } 33 } 34 } 35 else { 36 for (--high; high >= 0; high--) { 37 if (nums[high] != nums[high + 1]) { 38 break; 39 } 40 } 41 } 42 } 43 for (++i; i < n; i++) { 44 if (nums[i] != nums[i - 1]) { 45 break; 46 } 47 } 48 } 49 50 return ret; 51 } 52 };
原文地址:https://www.cnblogs.com/osoii/p/12980040.html
- WordPress启用memcached动态缓存以及报错解决
- 升级CentOS6.5内核,开启Nginx的fastopen和reuseport特性
- Nginx网站使用CDN之后禁止用户真实IP访问的方法
- 相差数十倍的SQL性能分析(r11笔记第98天)
- shell脚本实现整站缓存和预缓存,进一步提升网站整体加载速度
- Oracle中的PGA监控报警分析(r11笔记第96天)
- MySQL错误修复记录:Table xx is marked as crashed and should be repaired
- WordPress百度自动推送JS优化,规避错误、重复推送问题
- Oracle 12c中DBCA搭建备库体验(r11笔记第92天)
- 一行代码彻底禁用WordPress缩略图自动裁剪功能
- MySQL中xtrabackup备份恢复全攻略(r12笔记第11天)
- 分享一次Linux任务计划crontab不执行的问题排查过程
- MySQL 5.6, 5.7并行复制测试(r12笔记第9天)
- MySQL 5.6, 5.7并行复制测试(二)(r12笔记第10天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 分母为0一定会抛异常吗?
- 明明有class为什么还是报ClassNotFoundException?
- Maven 错误找不到符号
- 环境变量配置为jdk8,却显示java版本为jdk7
- Python脚本按照当前日期创建多级目录
- linux常用的读取文件内容指令
- Executors.newSingleThreadScheduledExecutor();线程池中放入多个线程问题
- SqlServer批量删除表
- java 获取一天内crontab任务执行的时间点
- Python自学成才之路 魔术方法之一元,二元运算符
- Python自学成才之路 魔术方法之打印对象实例
- Python自学成才之路 装饰器必用的wraps注解
- Python自学成才之路 使用函数作为装饰器
- Python自学成才之路 装饰器编程之初试装饰器
- Python自学成才之路 元类中的__new__和__init__方法