题目

Given an array S of n integers, are there elements a, b, c in S 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.

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]

分析

题目隐含的条件,不能有重复的list,不能每个小list必须从小到大排序。

我的思路有两个
1 将n^3转化为2sum。leetcode第一题就是一道2sum,我用hashmap做的
2 使用数组左右指针。

实践来看,第二种方法更优。

这个有两个测试例没过。
稍后我会分析一下时间长的原因。

class Solution {public List<List<Integer>> threeSum(int[] nums) {HashSet<List<Integer>> set = new HashSet<>();List<List<Integer>> list = new ArrayList<>();for (int i = 0; i < nums.length; i++) {Map<Integer, Integer> map = new HashMap<Integer, Integer>();for (int k = i + 1; k < nums.length; k++) {if (map.containsKey(nums[k])) {List<Integer> tmpList = new ArrayList<>();tmpList.add(nums[i]);tmpList.add(nums[k]);tmpList.add( 0 - nums[i] - nums[k]);Collections.sort(tmpList);set.add(tmpList);} else {map.put(0 - nums[i] - nums[k], k);}}}list.addAll(set);return list;}
}

这是左右指针的方法,去掉了放进set去重的部分,时间更短。
那如何保证不重复呢,关键点在于排序。一个有序的数组,相同的数就会相邻。
在这个程序中 if (i == 0 || (i > 0 && nums[i] != nums[i-1]))会去掉-sum相同的情况,而while (k1 < k2 && nums[k1] == nums[k1+1]) k1++;
while (k1 < k2 && nums[k2] == nums[k2-1]) k2–;会去掉指针移动时相同的情况。

 public static List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> list = new ArrayList<>();for (int i = 0; i < nums.length - 2; i++) {if (i == 0 ||  (i > 0 && nums[i] != nums[i-1])) {int k1 = i + 1;int k2 = nums.length - 1;while (k2-k1>=1) {if (nums[i] + nums[k1] + nums[k2] == 0) {list.add(Arrays.asList(nums[i], nums[k1], nums[k2]));while (k1 < k2 && nums[k1] == nums[k1+1]) k1++;while (k1 < k2 && nums[k2] == nums[k2-1]) k2--;k1++;k2--;} else if (nums[i] + nums[k1] + nums[k2] > 0) {k2--;}else {k1++;}}}}return list;}

leetcode解题方案--015--3 sum相关推荐

  1. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  2. LeetCode—494. 目标和(Target Sum)——分析及代码(Java)

    LeetCode-494. 目标和[Target Sum]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代码 (3)结果 2. 动态规划+节省空间 (1)思路 ...

  3. [英雄星球六月集训LeetCode解题日报] 第七日 哈希表

    [英雄星球六月集训LeetCode解题日报] 第七日 哈希表 一. 442. 数组中重复的数据 1. 题目描述 2. 思路分析 3. 代码实现 二. 2068. 检查两个字符串是否几乎相等 1. 题目 ...

  4. Leetcode解题(第974题)

    Leetcode解题(第974题) 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 实例: 输入:A = [4,5,0,-2,-3,1],K=5 输出:7 解释: ...

  5. LeetCode解题报告汇总

    LeetCode解题报告: [LeetCode]1.Two Sum - Yoona - 博客频道 - CSDN.NET [LeetCode]2.Add Two Numbers - Yoona - 博客 ...

  6. [LeetCode解题报告] LCP 49. 环形闯关游戏

    [LeetCode解题报告] LCP 49. 环形闯关游戏 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 四. 参考链接 ...

  7. 最全中文leetcode解题攻略:思路知识点代码...搞定AI大厂笔试

    本文经AI新媒体量子位(公众号ID:qbitai)授权转载,转载请联系出处. 本文约多图,建议阅读5分钟. 本文为你分享中文leetcode解题攻略,助你通过AI大厂笔试. 当代程序员的困惑可能大致分 ...

  8. 算法大赛十强战队解题方案大公开!【附PPT下载】

    2020腾讯广告算法大赛已圆满结束,决赛舞台上一个又一个设计巧妙.思路清晰的解题方案,仍旧让每位观众都记忆犹新. 纵观决赛,其中最显眼的就是冠军战队"DYG"对于BERT的应用,他 ...

  9. LeetCode解题记录(409)——最长回文串

    LeetCode解题记录--最长回文串 题目描述 示例 题目理解 解题思路 题目描述 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比 ...

最新文章

  1. nginx已添加systemctl,但不能开机自启动问题
  2. 2013年1季度中国汽车品牌口碑研究报告 ——自主A级车
  3. 安卓高级6 拍照或者从相册获取图片 并检测旋转角度或者更新画册扫描
  4. Maven私服搭建(Nexus Repository Manager 3)
  5. python3精要(19)-全局变量global和工厂函数,lambda,变量作用范围,nonlocal
  6. Project2010的新特性
  7. 玩大数据期间碰到的一些问题总结
  8. python rq asyncio_python异步IO-asyncio
  9. Tensorflow官方文档学习理解 (一)
  10. php 获取客户端的ip、地理信息、浏览器信息、本地真实ip
  11. Jaspersoft 与springboot结合生成一维码,二维码
  12. QuickSort的基本CPU实现代码
  13. 【介绍了Sentaurus TCAD结构编辑器中可用的网格掺杂操作】
  14. 手机聊天记录备份与恢复的方法汇总
  15. HDMI EDID详细解析
  16. sublime去掉空行 sublime批量删除空白行
  17. 【lphtw】第三弹笔记ex24-ex35
  18. Java实现短信验证码(阿里云短信服务)
  19. linux之调试mipi液晶屏
  20. LeetCode #77 组合

热门文章

  1. jdk搭建步骤及javac不是内部命令的解决方法
  2. H5搜索功能iOS键盘“换行”改为“搜索”
  3. 支持安卓和苹果充电协议的QC3.0快充方案-UP9616
  4. vant Weapp版本没有自带表单校验
  5. Mybatis注解写SQL语句
  6. 手机出故障时的23种维修技巧
  7. LSTM(长短记忆网络)
  8. mysql隔离级别实现原理
  9. uniapp预览图片不显示的问题
  10. 2016年做好跨境电商,出口物流更重要