leecode第十五题(三数之和)
- class Solution {
- public:
- void quick_order(vector<int>& num, int star, int en)//快排
- {
- int start = star;
- int end = en;
- if (start >= end)
- return;
- int index = num[start];//就第一个设为阈值
- while (start < end)
- {
- while (start < end && index <= num[end])//先看右边,把第一个小于index数找出
- end--;
- int temp1 = num[start];//交换
- num[start] = num[end];
- num[end] = temp1;
- while (start < end && index >= num[start])//再看右边,把第一个大于index的数找出
- start++;
- int temp2 = num[start];//交换
- num[start] = num[end];
- num[end] = temp2;
- }
- quick_order(num, star, start-);//分左右子集迭代
- quick_order(num, start + , en);
- return;
- }
- vector<vector<int>> threeSum(vector<int>& nums) {
- int len=nums.size();
- vector<vector<int>> res;
- if(len==)//输入判断
- return res;
- int start=,end=len-;
- quick_order(nums,start,end);//快排
- vector<vector<int>> v2;
- for (int c = nums.size()-; c >= ; ){
- for (int a = , b = c-; a < b; ){
- int tmp_sum = nums[a]+nums[b];
- if (tmp_sum < -nums[c]){
- ++a;
- } else if (tmp_sum > -nums[c]){
- --b;
- } else {
- vector<int> v = {nums[a], nums[b], nums[c]};
- v2.push_back(v);
- do{//去重复 a b
- ++a;
- } while (a < b && nums[a-] == nums[a]);
- do{
- --b;
- } while (a < b && nums[b+] == nums[b]);
- }
- }
- do{//去重复 c
- --c;
- } while (c >= && nums[c+] == nums[c]);
- }
- return v2;
- /*for(int fir=1;fir<len-1;fir++)
- {
- int sec=fir-1,thr=fir+1;
- while(sec>=0 && thr<=len-1)
- {
- int sum=nums[fir]+nums[sec]+nums[thr];
- if (sum==0)
- {
- vector<int> node={nums[sec],nums[fir],nums[thr]};
- bool flag=true;
- for(int i=0;i<res.size();i++)
- {
- if(node==res[i])
- flag=!flag;
- }
- if(flag)
- res.push_back(node);
- sec = sec - 1;
- }
- else if (sum>0)
- sec=sec-1;
- else if (sum<0)
- thr=thr+1;
- }
- }
- return res;*/
- }
- };
分析:
不写代码永远不知道自己有多菜,一个快排写的我哭了,然后说主要思想:
未注释的是别人的代码,排序后,令【a,。。。。,b,c】这种形式,让c从右往左遍历,a初始化为0,从左向右移动,b初始化c-1,从右往左移动。在c遍历中,计算a+b,若a+b<-c,说明a太小了,a++,若a+b>-c,说明b大了,b--。最让我值得学习的是去重复,其实不难,就是a,b,c在各自道路上有重复就前进。
注释的是我自己的想法,排序后,令【。。。a,b,c,。。。】这种形式,b从左向右遍历,a初始化b-1,从b往左移动,c初始化b+1,从b往右移动。在b遍历中,计算a+c,若a+b+c>0,a--,若a+b+c<0,b++。这里已经实现了除去重复所有功能,且时间复杂度和上面一样,但是就在去重复这里我懵了,我先按查找已被选择的三数,但是碰到一个变态长的数组,时间复杂度蹭蹭的上涨,然后我就分析重复情况,有两个例子【-1,0,0,1】和【-2,-1,-1,0,1,2】,一个是【【-1,0,1】】,一个是【【-1,-1,2】,【-1,0,1】】,这里面如果你让b跳过重复的,那就错过后面案例的【-1,-1,2】,如果不跳过,前面案例就会重复,搞的我又一点点分析,但是真的好难写,难写在于解决一个情况,但是又有新的情况,二者特矛盾,有一没二那种,后来代码越写越长,还丑,我就只能捂着脸学习别人的思想了。
下次再碰到想到中间指针时候,想想指针从后向前或从前向后的情况。
leecode第十五题(三数之和)的更多相关文章
- LeeCode数组第15题三数之和
题目:三数之和 内容: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中 ...
- LeetCode 第15题-三数之和
1. 题目 2.题目分析与思路 3.思路 1. 题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且 ...
- LeetCode第十八题-四数之和
4Sum 问题简介:定n个整数和整数目标的数组nums,是否有元素a,b,c,d在nums中,使a+b+c+d=target? 举例: 给定数组 nums = [1, 0, -1, 0, -2, 2] ...
- 【leetcode 简单】第三十八题 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值( ...
- leetcode 刷题(数组篇)15题 三数之和 (双指针)
很有意思的一道题,值得好好思考,虽然难度只有Mid,但是个人觉得不比Hard简单 题目描述 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b ...
- LeetCode第十六题-找出数组中三数之和最接近目标值的答案
3Sum Closest 问题简介: 给定n个整数的数组nums和整数目标,在nums中找到三个整数,使得总和最接近目标,返回三个整数的总和,可以假设每个输入都只有一个解决方案 举例: 给定数组:nu ...
- #leetcode刷题之路16-最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...
- leetcode第15题:三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- Leetcode题库——16.最接近的三数之和
@author: ZZQ @software: PyCharm @file: threeSumClosest.py @time: 2018/10/14 20:28 说明:最接近的三数之和. 给定一个包 ...
随机推荐
- 线程池demo
package test; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callabl ...
- 设置PhoenixOS进入图形界面
phoenix操作系统很淡疼的一点就是每次启动都进入命令行界面,而且要想进入图形界面,每次都得配置. 开启虚拟机后,会出现引导界面,在虚拟机中连按2次“E”键进行编辑 输入参数“空格nomodeset ...
- truncate table很慢之enq: RO - fast object reuse和local write wait等待分析
使用ASSM表空间(默认模式)的时候,在dss系统中确实会出现truncate很慢的现象,但是他不会100%重现,得看概率.通过sql trace(对任何v$sysstat看起来资源消耗很低的情况,都 ...
- 01: Python基本数据类型
目录: 1.1 列表和元组 1.2 字符串 1.3 字典 1.4 集合 1.1 列表和元组返回顶部 1.列表基本操作 1. 列表赋值 a = [1,2,3,4,5,6,7,8] a[0] = 100 ...
- win7安装mysql-8.0.13-winx64
这里展示一下,由于需要安装一个版本测试一下数据,其实就是超简单的啦. 下包 注:https://dev.mysql.com/downloads/mysql/ 解压与配置 [mysqld] basedi ...
- javascript 点击按钮实现隐藏显示切换效果
原文链接:http://www.jb51.net/article/79083.htm <html> <head> <meta charset="gb2312&q ...
- centOS 安装 Webmin
http://www.webmin.com/rpm.html 修改配置文件在这里: /etc/webmin/miniserv.conf
- 前端 --- 2 css
一. CSS的几种引入方式 1.行内样式 2.内部样式 写在网页的<head></head>标签对的<style></style>标签对中 3.外部样式 ...
- Django 创建项目笔记
基本命令 mkdir mysite # 创建项目目录,常取名mysite cd mysite virtualenv env # env\Scripts\activate.bat # Win pip i ...
- CentOS 7.3 上安装docker
Docker,分为社区版CE和企业版EE.社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务. 一.安装docker 1.Docker 要求 CentOS 系统的内核版本高于 3 ...