Leetcode:NO.15 三数之和 夹逼
题解
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:
[[-1, 0, 1],[-1, -1, 2]
]
链接:https://leetcode-cn.com/problems/3sum
解题记录
- 三个数相加为0,几种情况:
- 0,0,0
- 两负一正
- 两正一负
- 0,一正一负
- 通过将数组分割成正负两个数组
- 正的里面取一个,负的里面取一个,用0减去之后看看剩的是否在数组里
- 因此要通过数组构建一个map (直接用hashmap速度会慢,好在这题数据边界不夸张)
- 取的时候通过控制边界防止出现重复情况
/*** @author ffzs* @describe* 一正两负, 一负两正* @date 2020/6/12*/public class Solution {public static List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res = new ArrayList<>();int max=0, min=0;int zero = 0, plus = 0, minus = 0;for (int num : nums) {if (num==0) zero++;else if (num>0){max = Math.max(max, num);plus ++;}else {min = Math.min(min, num);minus ++;}}if (zero>=3) {res.add(new ArrayList<>(List.of(0,0,0)));}if (nums.length < 3 || max==0 || min == 0) {return res;}if (min*2 + max > 0) max = -2*min;else if (max*2 + min < 0) min = -2*max;int[] map = new int[max-min+1];int[] ps = new int[plus];int[] ms = new int[minus];plus = 0;minus = 0;for (int num : nums) {if (num>=min && num<=max) {if (map[num-min]++ == 0){if (num > 0) ps[plus++] = num;else if (num < 0) ms[minus++] = num;}}}Arrays.sort(ps,0,plus);Arrays.sort(ms,0,minus);int start=0;for (int i = minus-1; i >= 0; --i) {int m = ms[i];int minP = -m/2; // 确定边界,左边选一个右边选一个 m <= sum <= pwhile (start < plus && ps[start] < minP) start++;for (int j = start; j < plus; j++) {int p = ps[j];int sum = -(p+m);if (sum >= m && sum <= p) { // 控制边界 避免重复if (sum == m || sum == p) {if (map[sum - min] > 1) res.add(Arrays.asList(m, sum, p));} else if (map[sum - min] > 0) res.add(Arrays.asList(m, sum, p));}else if (sum < m) break; // 控制边界 避免重复}}return res;}public static void main(String[] args) {int[] nums = {-1,0,1,2,-1,-1,-4};
// int[] nums = {0,0,0};System.out.println(threeSum(nums));}
}
Leetcode:NO.15 三数之和 夹逼相关推荐
- leetcode系列--15.三数之和
leetcode 第15题 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三 ...
- leetcode No.15-16 三数之和相关问题
leetcode 15. 三数之和 题目 链接:https://leetcode-cn.com/problems/3sum 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...
- Leetcode python《热题 HOT 100》15. 三数之和
Leetcode python 之 <热题 HOT 100>:https://leetcode-cn.com/problemset/hot-100/ 15. 三数之和 给定一个包含 n 个 ...
- 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 三数之和
[双指针|模拟] leetcode 15 三数之和 1.题目 题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ? ...
- 代码随想录算法训练营第07天 | LeetCode 454.四数相加2,383. 赎金信,15. 三数之和,18. 四数之和,总结
LeetCode [454. 四数相加 II] 题目:给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足 ...
- LeetCode刷题笔记- 15.三数之和
LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...
- Java实现 LeetCode 15 三数之和
15. 三数之和 给定一个包含 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[ ...
最新文章
- 文档的管理计算机,如何使用FTP自动同步备份电脑文件数据?
- Android实现相册分享功能,Android系统自带分享功能的实现(可同时分享文字和图片)...
- coddenomicon工具
- 不在更改国内网络账号的ID了
- 产品经理三大证书,考哪个好
- 百度地图API获取经纬度实战
- 选择小程序的8大理由,让你拒绝说No
- 基于FME实现地铁路径规划
- better-scroll的使用以及常见的api总结
- 现在ChatGPT可以使用谷歌插件进行快速交互访问了!
- 树枝学术 | 图书查找、论文查找全攻略
- ThinkPHP实现定时执行任务的两种方法
- 如何确定一个期刊是不是EI?
- Linux下路由器的配置
- 2023 开工大吉!爆料各司年终奖
- C++优化之使用emplace、emplace_back
- 开源素材网_34个用于广告素材的开源工具
- 迅为4418开发板Linux系统修改和固定MAC地址
- jedis是什么?jedis概念
- 服务一直处于‘启动中‘,无法关闭(已解决)
热门文章
- Ubuntu mirror source modify
- [学习笔记] CDQ分治 从感性理解到彻底晕菜
- 关于构建之法中小飞问题的个人看法
- 粒倍营浅谈如何做好SEO
- java 与 c gzip_zlib和gzip生成不同的数据
- python爬虫数据挖掘_Python网页爬虫文本处理科学计算机器学习数据挖掘兵器谱...
- 10 个 Python 可视化作品,今天源码全部开放下载!
- 计算机网络-自顶向下(学习笔记)
- 【人工智能项目】- 深度学习实现猫狗大战
- 《大唐姻缘传》(李治篇) 第一章 天妒人眷 皇限将至