伍六七带你学算法 进阶篇-三数之和
三数之和 难度-中等
题目:给你一个包含 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());}
}
以上!
伍六七带你学算法 进阶篇-三数之和相关推荐
- 伍六七带你学算法 进阶篇-生命游戏
有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...
- 伍六七带你学算法 进阶篇-排序算法
给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...
- 伍六七带你学算法 入门篇 ——最大子序和
力扣 53. 最大子序和 难度简单 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4 ...
- 伍六七带你学算法 入门篇-卡牌分组
力扣-914. 卡牌分组 难度-简单 这是一道非常有趣的题,提交通过率令人深思 ,思考它是不是一道简单的题- 开始正题: 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以 ...
- 伍六七带你学算法 入门篇-最小的k个数
java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...
- 伍六七带你学算法 入门篇——最后一个单词的长度
难度 简单 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度.如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词. 如果不存在最后一个单词,请返回 0 . 说 ...
- 伍六七带你学算法 入门篇-链表的中间节点
力扣-876链表的中间节点 难度-简单 给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此 ...
- 伍六七带你学算法 入门篇-最长回文串
力扣解题,每日一题:409. 最长回文串 难度- 简单 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" ...
- 伍六七带你学算法 入门篇-拼写单词
力扣解题,每日一题 1160. 拼写单词 难度- 简单 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 w ...
最新文章
- 投资互联网+企业级IT呈现三大新趋势
- 2021-06-04
- win7 64编译64位boost
- ABAP数据库操作系列之操作语句讲解Select
- 持续集成工具jenkins的部署--Windows篇
- 牛客网(剑指offer) 第十四题 链表中倒数第k个节点
- linux错误自动报告工具,linux – 关闭abrt的电子邮件通知(自动错误报告工具)
- 台式计算机cpu多好,2019台式处理器排行榜_台式机处理器排行榜 前六强详细介绍...
- javascript学习心得(1)replace
- vSphere 5.5 使用Web Client打开控制台窗口显示连接超时
- Spring bean注入之constructor-arg注入和property注入的区别
- 在计算机桌面中选择了隐藏如何显示不出来的,电脑桌面文件被隐藏了怎么办
- 关于VC句柄的一种可爱的解释
- 利用在线PS将一张图片上的中文改写成英文
- Vue中this的指向问题
- 太可怕了!给一个词就能模仿你的笔迹,Facebook这款神器不敢开源代码
- 如果使用编程判断闰年和平年,大神勿喷!
- 线性规划的对偶问题(The Dual of LP)
- java.lang.IllegalStateException: Web app root system property already set to different value: 'webap
- elasticsearch 批量查询