数组-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

相关文章

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue3项目将所有访问后端springboot的接口统一管理带跨域

vue3项目将所有访问后端springboot的接口统一管理带跨域 一、前言1.安装Axios2.创建Axios实例3.创建API服务文件4.在组件中使用API服务 二、跨域三、总结 一、前言 在Vue 3项目中,统一管理所有访问后端Spring Boot接口的最佳实践是创建一个专门的API服务层。这可以让你的代码更加模块化、可维护和集中管理。你可以使用Axios库作为HTT

LeetCode--231 2的幂

题目 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false class Solution {public:bool isPowerOfTwo(int n) {if (n <= 0) return fals

LeetCode--234 回文链表

题目 请判断一个链表是否为回文链表。 示例 示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val

LeetCode--220 存在重复元素 III

题目 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。 示例 示例 1:输入: nums = [1,2,3,1], k = 3, t = 0输出: true示例 2:输入: nums = [1,0,1,1], k = 1, t = 2输出: true示例

LeetCode--217 存在重复元素

题目 给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true class Solution {p

LeetCode--214 最短回文串

题目 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 示例 1:输入: "aacecaaa"输出: "aaacecaaa"示例 2:输入: "abcd"输出: "dcbabcd" 思路: 我们需要添加多少个字符与给定字符串的前缀子串回文的长度有关. 也就是说去掉其前缀的回文子串,我们只需要补充剩下的子串的逆序

LeetCode--206 反转链表

题目 反转一个单链表。 示例 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL class Solution {public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr){return head;}ListNo

LeetCode--204 计数质数

题目 统计所有小于非负整数 n 的质数的数量。 示例 示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 class Solution {public:int countPrimes(int n) {if (n <= 2) return 0;int cnt = 0;vector<bool> isPrime(n, true);