Leetcode(15)-三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
自己的思路:如果追求思路简单,就是暴力的去求解每三个字符的和是否为0,但是有三层循环,时间复杂度太高,提交,超出时间限制。
(1)
- 排序。排序可以让数据变得有序,在许多算法中都有使用。
- 定义三个指针
i,left,right. - i用来遍历数据,从下下标为0一直到len-3。
- 对于每一个i,令
left=i+1,right=len-1,然后检查三个指针所指数据的和,
如果为0,说明找到一个符合条件的组合,把三个数放入vector中然后再放入map中,接着把left++,right--。
如果>0,则说明当前的right偏大,则把right--,因为是排序的,所以整体和会变小。
如果<0,说明当前的left偏小,则把left++,因为是排序的,所以整体的和会变大。(这里变大变小不是一定的,因为可能存在重复的数据,不影响)vector<vector<int>> threeSum(vector<int>& nums)
{ vector<vector<int>> result;
int len = nums.size();
map<vector<int>,int> m;
if(nums.empty()||len<3) return result;
sort(nums.begin(),nums.end());
vector<int> res;
int p1,p2,p3;
int i=0;
for(p1=0;p1<=len-3;p1++)
{
int left=p1+1;
int right = len-1;
while(left<right)
{
if(nums[p1]+nums[left]+nums[right]==0)
{
res.push_back(nums[p1]);
res.push_back(nums[left]);
res.push_back(nums[right]);
if(!m.count(res))
{
m.insert(map<vector<int>,int>::value_type(res,i++));
result.push_back(res);
}
res.clear();
left++;
right--;
}
else if(nums[p1]+nums[left]+nums[right]<0)
left++;
else
right--;
}
}
return result;
}这里用map和map中的count函数是为了去除相同的组合,因为数组是排序好的,所以找到的组合也是排序好的,如果相同的话,是完全相同的,否则我们还得先排序才能比较。
(2)大神们还有比这个更加快速的解决方案,那就是
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> rs;
vector<int> res;
if(nums.size() == 0) return rs;
sort(nums.begin(), nums.end());//先对目标数组进行从小到大的排序
for (int i = 0; i < nums.size() - 2; i++)
{
if (nums[i] > 0) return rs;//如果最小值都大于0,那么就不用再找了
if (i > 0 && nums[i] == nums[i-1]) //如果和前一个值相等,就跳过,去重
continue;
int tmpTarget = 0 - nums[i];//接下来就求nums[i]的相反数 int beg = i + 1, end = nums.size() - 1;//也是从两边开始往中间查找
while (beg < end)
{
if (nums[beg] + nums[end] == tmpTarget)
{
res.push_back(nums[i]);
res.push_back(nums[beg]);
res.push_back(nums[end]);
rs.push_back(res);
while(beg < end - 1 && nums[end] == nums[end-1]) //同样是和前一个相同,去重
end--;
end--;
res.clear();
}
else if (nums[beg] + nums[end] > tmpTarget)
end--;
else
beg++;
}
}
return rs;
}
Leetcode(15)-三数之和的更多相关文章
- LeetCode 15. 三数之和(3Sum)
15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...
- Java实现 LeetCode 15 三数之和
15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以 ...
- LeetCode——15. 三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- LeetCode 15. 三数之和(3Sum)
题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复 ...
- [Leetcode 15]三数之和 3 Sum
[题目] Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? ...
- [LeetCode]15. 三数之和(数组)(双指针)
题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三 ...
- [LeetCode] 15. 三数之和
题目链接:https://leetcode-cn.com/problems/3sum/ 题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a ...
- LeetCode:三数之和【15】
LeetCode:三数之和[15] 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的 ...
- 代码随想录第七天| 454.四数相加II、383. 赎金信 、15. 三数之和 、18. 四数之和
第一题454.四数相加II 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, ...
- leetcode题目15.三数之和(中等)
题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重 ...
随机推荐
- Vue基础之Vue的模板语法
Vue基础之Vue的模板语法 数据绑定 01 数据绑定最常见的形式就是使用插值表达式(两个大括号!)[也就是小胡子语法!mustache] <body> <!-- Vue.js的应用 ...
- 它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程
[Linux编程]守护进程(daemon)详解与创建_mick_seu的博客-CSDN博客_linux daemon https://blog.csdn.net/woxiaohahaa/article ...
- 美团配送A/B评估体系建设与实践
https://mp.weixin.qq.com/s/v3Fvp6Hed7ZGoE8FGlGMvQ
- Java 常见关键字总结:final、static、this、super!
final,static,this,super 关键字总结 final 关键字 final关键字,意思是最终的.不可修改的,最见不得变化 ,用来修饰类.方法和变量,具有以下特点: final修饰的类不 ...
- springboot开启多线程配置
一.配置线程池参数 @EnableAsync @Configuration public class TaskExecutorConfig { @Bean public TaskExecutor ta ...
- SSH框架搭建详细步骤整理
学习Java面前有两座山,一座山叫SSM,一座山叫SSH,跨越了这两座山之后才能感受到这个语言的魅力所在,SSM框架的搭建详细在之前博客已经涉及了,今天来整理SSH框架详细步骤: 生有涯 而 学无涯 ...
- linux下的ARP攻击(kali)
这是我的学习总结,刚入坑网络安全,写的不好或者有什么错误的希望大佬们指正 首先了解ARP的作用以及原理: ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP ...
- Java8 ,LocalDate,LocalDateTime处理日期和时间工具类,
Java8 ,LocalDate,LocalDateTime处理日期和时间工具类 1.获取今天的日期 2.在Java 8 中获取年.月.日信息 3.在Java 8 中处理特定日期 4.在Java 8 ...
- Flink-v1.12官方网站翻译-P012-Stateful Stream Processing
有状态的流处理 什么是状态? 虽然数据流中的许多操作一次只看一个单独的事件(例如事件解析器),但有些操作会记住多个事件的信息(例如窗口操作符).这些操作被称为有状态操作.一些有状态操作的例子. - 当 ...
- 【BFS】hdu 1973 Prime Path
题目描述: http://poj.org/problem?id=3414 中文大意: 使用两个锅,盛取定量水. 两个锅的容量和目标水量由用户输入. 允许的操作有:灌满锅.倒光锅内的水.一个锅中的水倒入 ...