数组-leetcode#15-找出三个数之和等于0的所有不重复序列

2024-05-30 04:58

本文主要是介绍数组-leetcode#15-找出三个数之和等于0的所有不重复序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

暴力算法,复杂度O(n^3),超时,最后我们还需要去重复等,使用排序方法,从小到大排序数组,然后依次确定第一个数,第二个数,第三个数,通过有序限制来防止重复,即我们要求三个数nums[i]<nums[j]<nums[k]:

(1)先排序数组

(2)循环找第一个数,下标记为i,范围在0-n-1;如果当前i下标的数等于前面i-1的数,那么就跳出本次循环,因为在i-1步之前,我们已经考虑过选择这个数作为第一个数了。

(3)确定第二个数,下标记为j,范围在i+1-n-1;同样的如果当前j下标的数等于前面j-1的数,那么就跳出本次循环,因为在j-1步之前,我们已经考虑过选择这个数作为第二个数了。

(4)查找第三个使得求和为0的数是否存在,下标记为j,范围是j+1到n-1;其实第二个数和第三个数是并列来找的,一次循环i中,k是从末尾n-1开始往数组头部移动,j是从i+1开始往数组尾部移动,在循环j内,当j<k,并且三个数之和大于0的时候,k--,往左移动,那么跳出循环时候,只有两种情况,j==k或者求和小于等于0,如果j==k说明没找到,如果求和等于0,说明找到了,把三个数组一个vector加入结果集合res,如果求和小于0,说明没必要再往左移动k了,因为排序后的前面求和只会更小。

(5)这里面去重复是通过判断当前下标与前一个元素是不是相当来做的,相当,就不需要做本次循环,当前面两个数都确定了,使得求和为0的第三个数也就确定了,所以从后往前找是否存在。

 

这篇关于数组-leetcode#15-找出三个数之和等于0的所有不重复序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015637

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L