C#LeetCode刷题之#15-三数之和(3Sum)
问题
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3618 访问。
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:The solution set must not contain duplicate triplets.
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
示例
public class Program {
public static void Main(string[] args) {
var intervals = new int[] { -1, 0, 1, 2, -1, -4 };
var res = ThreeSum(intervals);
ShowArray(res);
intervals = new int[] { 0, 0, 0 };
res = ThreeSum2(intervals);
ShowArray(res);
Console.ReadKey();
}
private static void ShowArray(IList<IList<int>> list) {
foreach(var nums in list) {
foreach(var num in nums) {
Console.Write($"{num} ");
}
Console.WriteLine();
}
}
public static IList<IList<int>> ThreeSum(int[] nums) {
//暴力解法肯定超时无法AC
var res = new List<IList<int>>();
for(int i = 0; i < nums.Length; i++) {
for(int j = 0; j < nums.Length; j++) {
for(int k = 0; k < nums.Length; k++) {
if(nums[i] + nums[j] + nums[k] == 0 &&
i != j && j != k && k != i) {
var line = new List<int> { nums[i], nums[j], nums[k] };
line = line.OrderBy(r => r).ToList();
if(!res.Any(l => l[0] == line[0] &&
l[1] == line[1] &&
l[2] == line[2])) {
res.Add(line);
}
}
}
}
}
return res;
}
public static IList<IList<int>> ThreeSum2(int[] nums) {
//先固定 i,再计算三数之和是不是0
//需认真分析是否有重复的三元组
var res = new List<IList<int>>();
var length = nums.Length;
Array.Sort(nums);
for(var i = 0; i < length - 2; i++) {
//定义左右指针j和k
//i为循环变量,可以认为先固定了i
var j = i + 1;
var k = length - 1;
//分析j和k
while(j < k) {
//若和大于0,则需要减整体的值,将右指针 k 减1
if(nums[i] + nums[j] + nums[k] > 0) k--;
//若和小于0,则需要加整体的值,将左指针 j 加1
else if(nums[i] + nums[j] + nums[k] < 0) j++;
else {
//若和正好等于0,将其存放进结果中
//然后需要处理重复三元组的情况
//不重复三元组需要3个索引各不相同并且组成的值的结果不能重复
//以下3个条件组成了满足不重复三元组的所有条件
//条件1:i、j、k的顺序具有稳定性,总是从小到大
res.Add(new int[] { nums[i], nums[j], nums[k] });
//首先使用 j + 1 <= nums.Length - 1 保证数组不越界
//条件2:再向右找到第1个值不和当前左指针相同的值的索引
//若为 1,1,1,1,1,2,找到2
while(j + 1 <= nums.Length - 1 && nums[j + 1] == nums[j++]) { }
}
}
//条件3:向右找到最后1个和当前被固定的 i 的值相同的值的索引
//若为 1,1,1,1,1,2,找到2前面的最后一个1
while(i + 1 <= nums.Length - 1 && nums[i + 1] == nums[i]) i++;
}
return res;
}
}
以上给出2种算法实现,以下是这个案例的输出结果:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3618 访问。
-1 0 1
-1 -1 2
0 0 0
分析
显而易见, ThreeSum 的时间复杂度为: O(n3)O(n^3)O(n3),ThreeSum2 的时间复杂度为:O(n2)O(n^2)O(n2) 。
C#LeetCode刷题之#15-三数之和(3Sum)的更多相关文章
- LeetCode 15. 三数之和(3Sum)
15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...
- Leetcode题库——15.三数之和
@author: ZZQ @software: PyCharm @file: threeSum.py @time: 2018/10/6 19:47 说明:给定一个包含 n 个整数的数组 nums,判断 ...
- leetcode刷题笔记-1. 两数之和(java实现)
题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使 ...
- LeetCode 刷题笔记 1. 两数之和(Two Sum)
tag: 栈(stack) 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案. ...
- #leetcode刷题之路15-三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- #leetcode刷题之路1-两数之和
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的商. 示例 1:输入: ...
- (1)leetcode刷题Python笔记——两数之和
题目如下: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...
- #leetcode刷题之路18-四数之和
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满 ...
- C#LeetCode刷题之#633-平方数之和( Sum of Square Numbers)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3885 访问. 给定一个非负整数 c ,你要判断是否存在两个整数 ...
- Java实现 LeetCode 15 三数之和
15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以 ...
随机推荐
- Mysql数据库搭建集群---实现主从复制,读写分离
参考博客:https://blog.csdn.net/xlgen157387/article/details/51331244 A. 准备:多台服务器,且都可以互相随意访问root用户,都可以随意进 ...
- T133308 57级返校测试重测-T3-成绩单
大致题意: 给定n个学生的学号和分数, 求各个分数段的人数, 求把学号排序后的序列, 求满分的人数以及学号. 基本思路: 虽然看起来很繁琐(?),但就非常非常的简单,直接按题意做就好了. 然后有个坑, ...
- nginx的基础学习+实战
文章目录 一.前言 二.反向代理 三.负载均衡 四.动静分离 参考视频:尚硅谷Nginx教程(2019发布) 参考链接:Windows下Nginx负载均衡实现 一.前言 Nginx (engine x ...
- Docker 入门教程(1)——安装
docker大名听说了很久,一直没有去研究过,但现在面试动不动要求docker,还是研究下吧.由于我的电脑是win10系统(穷,买不起mac),安装过程各种坑爹问题不断,一度都想放弃,所以说垃圾win ...
- F - Maximal Intersection --------暴力求解题
You are given n segments on a number line; each endpoint of every segment has integer coordinates. S ...
- 从零开始学Python网络爬虫PDF高清完整版免费下载|百度网盘
百度网盘:从零开始学Python网络爬虫PDF高清完整版免费下载 提取码:wy36 目录 前言第1章 Python零基础语法入门 11.1 Python与PyCharm安装 11.1.1 Python ...
- java基础(十)--空指针异常
空指针异常即:java.lang.NUllPointException异常,主要用于在对象为null的情况下,调用对象的方法或对象的属性时会抛出. 举例说明: public class TestBas ...
- socket网络
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- CSRF与XSS攻击的原理与防范
CSRF 1.概念与原理 CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统.例如: 用户访问A网站登陆并生成了cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网 ...
- 解决移动端rem加载瞬间页面错乱的方法(放大或者缩小)
移动端布局有很多种,这里我们最常使用到rem+百分比的布局方式(高度/字体设置rem单位,宽度设置百分比)来处理屏幕兼容,这种方法在兼容上是比较不错的,可以使得字体以及整体适应各种大小的屏幕,可以解决 ...