三数之和 难度-中等

题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum/


public class _15三数之和 {/*** 解题思路:*        首先要理解题意:1、要求从数组中取出符合条件的三个数字*                       2、不能有重复的答案->不是下标重复,是元素重复,无论顺序,比如 [1,3,-4] [1,-4,3]是一样的,属于重复答案*        然后我们开始想如何解题*                       1、这道题取出三个符合条件的数是没有难度的,遍历相等即可,难度在于不重复,这也是我上面标红的原因*                       2、不重复不代表需要直接去重,这样的话 [-1,-1,2]就不会出现在你的结果集中了*                       3、去重首先就是需要为数组排序,排序之后,相同的数就会相邻,这样我们在判断的时候就可以进行相应的忽略即去重*                       4、接下来请认真的看代码,我为每一行都进行了解释,有不理解欢迎留言* @param nums* @return*/public static List<List<Integer>> threeSum(int[] nums) {//调用数组排序(按从小到大排序)Arrays.sort(nums);//定义一个list,用来包装返回值List<List<Integer>> ls = new ArrayList<>();for (int i = 0; i < nums.length - 2; i++) {if (i == 0 || (i > 0 && nums[i] != nums[i - 1])) {  // 跳过可能重复的答案//定义一个l,用来标记第二个数的下标// r是第二个数的最大值,初始为数组的最后一个元素的下标// 定义一个sum,这样接下来计算就会省很多步int l = i + 1, r = nums.length - 1, sum = 0 - nums[i];while (l < r) {if (nums[l] + nums[r] == sum) {//如果符合情况,则添加在返回值中ls.add(Arrays.asList(nums[i], nums[l], nums[r]));//然后继续判断,是否有元素重复while (l < r && nums[l] == nums[l + 1]) l++;while (l < r && nums[r] == nums[r - 1]) r--;l++;r--;} else if (nums[l] + nums[r] < sum) {//如果 nums[l] + nums[r] + num[i] < 0 则说明当前数字相加之和还不够大,需要将指针往后移动// 则前面的指针往后移动一位 遇到重复的跳过while (l < r && nums[l] == nums[l + 1]) l++;   // 跳过重复值l++;} else {//如果 nums[l] + nums[r] + num[i] > 0 则说明当前数字相加之和过大,后面的元素已经不满足条件,// 则后面的指针往前移动一位 遇到重复的跳过while (l < r && nums[r] == nums[r - 1]) r--;r--;}}}}return ls;}//测试public static void main(String[] args) {int num[] = {1,-5,4,4,-5,4,-1};System.out.println(threeSum(num).toString());}
}

以上!

伍六七带你学算法 进阶篇-三数之和相关推荐

  1. 伍六七带你学算法 进阶篇-生命游戏

    有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...

  2. 伍六七带你学算法 进阶篇-排序算法

    给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...

  3. 伍六七带你学算法 入门篇 ——最大子序和

    力扣 53. 最大子序和 难度简单 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4 ...

  4. 伍六七带你学算法 入门篇-卡牌分组

    力扣-914. 卡牌分组 难度-简单 这是一道非常有趣的题,提交通过率令人深思 ,思考它是不是一道简单的题- 开始正题: 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以 ...

  5. 伍六七带你学算法 入门篇-最小的k个数

    java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...

  6. 伍六七带你学算法 入门篇——最后一个单词的长度

    难度 简单 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度.如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词. 如果不存在最后一个单词,请返回 0 . 说 ...

  7. 伍六七带你学算法 入门篇-链表的中间节点

    力扣-876链表的中间节点 难度-简单 给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此 ...

  8. 伍六七带你学算法 入门篇-最长回文串

    力扣解题,每日一题:409. 最长回文串 难度- 简单 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" ...

  9. 伍六七带你学算法 入门篇-拼写单词

    力扣解题,每日一题 1160. 拼写单词 难度- 简单 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 w ...

最新文章

  1. 投资互联网+企业级IT呈现三大新趋势
  2. 2021-06-04
  3. win7 64编译64位boost
  4. ABAP数据库操作系列之操作语句讲解Select
  5. 持续集成工具jenkins的部署--Windows篇
  6. 牛客网(剑指offer) 第十四题 链表中倒数第k个节点
  7. linux错误自动报告工具,linux – 关闭abrt的电子邮件通知(自动错误报告工具)
  8. 台式计算机cpu多好,2019台式处理器排行榜_台式机处理器排行榜 前六强详细介绍...
  9. javascript学习心得(1)replace
  10. vSphere 5.5 使用Web Client打开控制台窗口显示连接超时
  11. Spring bean注入之constructor-arg注入和property注入的区别
  12. 在计算机桌面中选择了隐藏如何显示不出来的,电脑桌面文件被隐藏了怎么办
  13. 关于VC句柄的一种可爱的解释
  14. 利用在线PS将一张图片上的中文改写成英文
  15. Vue中this的指向问题
  16. 太可怕了!给一个词就能模仿你的笔迹,Facebook这款神器不敢开源代码
  17. 如果使用编程判断闰年和平年,大神勿喷!
  18. 线性规划的对偶问题(The Dual of LP)
  19. java.lang.IllegalStateException: Web app root system property already set to different value: 'webap
  20. elasticsearch 批量查询

热门文章

  1. 2022-2028年中国塑料合成革的制造行业市场全景评估及发展趋势研究报告
  2. 数据类型转换pytorch
  3. JIT Compiler编译器及指令集
  4. 旷视MegEngine核心技术升级
  5. 色彩(颜色)空间原理(下)
  6. 斯坦福大学李飞飞团队图像分类课程笔记
  7. 你哪来这么多事(六):职工信息查找
  8. C++ 获取当前时间的年,月,日,以及时分秒
  9. JavaScript Collection
  10. 【js操作url参数】获取指定url参数值、取指定url参数并转为json对象