Leetcode 15.三数之和 双指针 or 暴力哈希
题目链接:传送门
题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
暴力+Hash
把所有数字用map记录个数,然后排序,拍完序之后n²暴力枚举两个数,求第三个数在map里边 不,然后怎么判是否有重复的方法就是把三个数直接hash,总体来说就是全部暴力,稍微加了一点点剪枝然后卡过去了。
时间复杂度 n²logn
const int mod =1e9+7;
class Solution {
int hash(int x,int y,int z){long long ans =1; ans = (ans*233+x)%mod;ans = (ans*234+y)%mod;ans = (ans*235+z)%mod;return ans;
}
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());map<long long,int> have; //hashmap<int,int> m;//装个数have.clear();m.clear();vector<vector<int>> ans;for(int i=0;i<nums.size();i++)m[nums[i]]++;int n = nums.size();if(n<3) return ans;for(int i=0;i<n-2;i++){for(int j=i+1;j<n-1;j++){int x=0-nums[i]-nums[j];//枚举两个数,求第三个数if(x<nums[j]) continue;if(m[x]-(nums[i]==x)-(nums[j]==x)>0) //看第三个数在map里边不{int c=hash(nums[i],nums[j],x); //在就把三数丢到hashif(!have[c]){have[c]=1;ans.push_back({nums[i],nums[j],x});}}}m[nums[i]]--;}return ans;}
};
双指针:
确实文盲了,看题解才知道这种应该是双指针的题目,先对数组进行排序。
循环确定第一个数 i
双指针指向第一个数字后边的最小值和最大值的位置,l=i+1,r=n-1
然后判断nums[i]+nums[l]+nums[r]是否为0,若小于零,左指针右移,大于零,右指针左移
相等就是左右指针同时往里移动
再加上判重,如果存在和为0,且当前左指针和他的下一个数相同,直接把左指针右移,右指针相反的。
代码如下:
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int n = nums.size();vector<vector<int>> ans;if(n<3) return ans;sort(nums.begin(),nums.end());for(int i=0;i<n-2;i++){//剪枝if(nums[i]>0) break;if(i>0&&nums[i]==nums[i-1])continue;int l=i+1,r=n-1;while(l<r){if(nums[i]+nums[l]+nums[r]==0){while(l<r && nums[l+1]==nums[l]) l++;while(l<r && nums[r-1]==nums[r]) r--;ans.push_back({nums[i],nums[l],nums[r]});l=l+1;r=r-1;}else if(nums[i]+nums[l]+nums[r]<0)l=l+1;else r=r-1;}}return ans;}
};// -4 -1 -1 0 1 2
Leetcode 15.三数之和 双指针 or 暴力哈希相关推荐
- [双指针|模拟] leetcode 15 三数之和
[双指针|模拟] leetcode 15 三数之和 1.题目 题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ? ...
- LeetCode 15. 三数之和【双指针】
15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums[ ...
- LeetCode 15三数之和16最接近的三数之和
三数之和(双指针) 题意: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...
- 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. 三数之和
题目描述 15. 三数之和 思路 思路1 比较容易想到的就是,求三数之和等于0,可以等价于求两个数的和,然后看这个和的相反数是否在nums里面. 但是 T_T这样的话复杂度太高了,会超时,捂脸,最后三 ...
- Leetcode 15.三数之和
Time: 20190920 Type: Medium 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所 ...
- Leetcode 15:三数之和(最详细解决方案!!!)
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 *a,b,c ,*使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. **注意:**答案中不可以包含重 ...
- 2021-5-11 Leetcode 15.三数之和
1.1我的解法以及考虑到的几点问题 1)数组长度小于3的不用考虑,直接返回 2)暴力法:每一次查找不是自己选择的数字,看一下能否凑成零(但是这样不知道如何去重) 3)拆成一个数字+LC 1.两数之和的 ...
最新文章
- Android4.0 修改系统屏幕分辨率方法
- MIMIC 以太坊医疗项目开发(7) 医疗智能合约 sample
- REST设计模式简介
- SQL Server各个版本功能比较
- Sharepoint学习笔记 –架构系列—10 Sharepoint的服务器端对象模型(Server Object Model) 2.内容层次结构
- JDK源码解析之 Java.lang.Enum
- 【图解漏洞】图解跨站请求伪造(CSRF)原理
- sql server 加密_SQL Server 2016中的新功能–始终加密
- 算法不会,尚能饭否之排序——直接插入排序(Insert sort)
- 常用编程语言介绍及各语言特点
- 武汉大学计算机学院应时老师,肖春霞 - 教师简历 CV- 武汉大学计算机学院
- 如何解决'chromedriver' executable needs to be in PATH.的问题
- Temporal Action Detection with Multi-level Supervision UFA论文阅读笔记
- android 编译libjpeg-turbo
- 7-20 简单计算器
- Transformer15
- 学习 ES 的笔记、全文检索、倒排索引、Lucene、ik中文分词器、Kibana使用Dev Tools
- 【开源STM32自平衡小车】 教你如何自己DIY一辆双轮自平衡小车
- 鲁棒随机优化(Robust Stochastic Optimization)和RSOME
- 常用运行代码记录(控制面板,命令行等)
热门文章
- ImageView / Text 使用 android:state_pressed 没有效果的处理方法
- ProgreassBar 60秒走完,
- 51nod 1220 约数之和【莫比乌斯反演+杜教筛】
- Tomcat 调优及 JVM 参数优化
- 2022-2028年中国绝缘栅双极晶体管(IGBT)行业投资分析及前景预测报告
- input属性为number,maxlength不起作用的解决方案
- LaTeX技巧 twocolumn 双栏
- WebApi2官网学习记录---异常处理
- 每周四十小时,你有多少是在为自己干活?
- android,与PHP通信,返回JSON