题解

给你一个包含 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 三数之和 夹逼相关推荐

  1. leetcode系列--15.三数之和

    leetcode 第15题 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三 ...

  2. leetcode No.15-16 三数之和相关问题

    leetcode 15. 三数之和 题目 链接:https://leetcode-cn.com/problems/3sum 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...

  3. Leetcode python《热题 HOT 100》15. 三数之和

    Leetcode python 之 <热题 HOT 100>:https://leetcode-cn.com/problemset/hot-100/ 15. 三数之和 给定一个包含 n 个 ...

  4. LeetCode 15. 三数之和(3Sum)

    15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...

  5. [双指针|模拟] leetcode 15 三数之和

    [双指针|模拟] leetcode 15 三数之和 1.题目 题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ? ...

  6. 代码随想录算法训练营第07天 | LeetCode 454.四数相加2,383. 赎金信,15. 三数之和,18. 四数之和,总结

    LeetCode [454. 四数相加 II] 题目:给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足 ...

  7. LeetCode刷题笔记- 15.三数之和

    LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...

  8. Java实现 LeetCode 15 三数之和

    15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以 ...

  9. 【LeetCode 算法】15.三数之和

    15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums[ ...

最新文章

  1. 文档的管理计算机,如何使用FTP自动同步备份电脑文件数据?
  2. Android实现相册分享功能,Android系统自带分享功能的实现(可同时分享文字和图片)...
  3. coddenomicon工具
  4. 不在更改国内网络账号的ID了
  5. 产品经理三大证书,考哪个好
  6. 百度地图API获取经纬度实战
  7. 选择小程序的8大理由,让你拒绝说No
  8. 基于FME实现地铁路径规划
  9. better-scroll的使用以及常见的api总结
  10. 现在ChatGPT可以使用谷歌插件进行快速交互访问了!
  11. 树枝学术 | 图书查找、论文查找全攻略
  12. ThinkPHP实现定时执行任务的两种方法
  13. 如何确定一个期刊是不是EI?
  14. Linux下路由器的配置
  15. 2023 开工大吉!爆料各司年终奖
  16. C++优化之使用emplace、emplace_back
  17. 开源素材网_34个用于广告素材的开源工具
  18. 迅为4418开发板Linux系统修改和固定MAC地址
  19. jedis是什么?jedis概念
  20. 服务一直处于‘启动中‘,无法关闭(已解决)

热门文章

  1. Ubuntu mirror source modify
  2. [学习笔记] CDQ分治 从感性理解到彻底晕菜
  3. 关于构建之法中小飞问题的个人看法
  4. 粒倍营浅谈如何做好SEO
  5. java 与 c gzip_zlib和gzip生成不同的数据
  6. python爬虫数据挖掘_Python网页爬虫文本处理科学计算机器学习数据挖掘兵器谱...
  7. 10 个 Python 可视化作品,今天源码全部开放下载!
  8. 计算机网络-自顶向下(学习笔记)
  9. 【人工智能项目】- 深度学习实现猫狗大战
  10. 《大唐姻缘传》(李治篇) 第一章 天妒人眷 皇限将至