15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

3 <= nums.length <= 3000
-105 <= nums[i] <= 10^5

class Solution {/*** 双指针 O(n^2)* 首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上。* 依然还是在数组中找到 abc 使得a+b+c=0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。* 接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。* 如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。*/public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res = new ArrayList<>();Arrays.sort(nums);// 找出a + b + c = 0// a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.length; i++) {// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了if (nums[i] > 0) return res;// 错误去重a方法,将会漏掉-1,-1,2 这种情况//if (i + 1 < nums.length && nums[i] == nums[i + 1]) continue;// 正确去重a方法if (i - 1 >= 0 && nums[i] == nums[i - 1]) continue;int l = i + 1, r = nums.length - 1;while (l < r) { // 不能等于,等于的换凑不出三个数为一组// 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组//while (l < r && nums[r] == nums[r - 1]) r--;//while (l < r && nums[l] == nums[l + 1]) l++;if (nums[i] + nums[l] + nums[r] > 0) r--;else if (nums[i] + nums[l] + nums[r] < 0) l++;else {res.add(Arrays.asList(nums[i], nums[l], nums[r]));// 去重逻辑应该放在至少找到一个三元组之后,再对b和c去重while (l < r && nums[r] == nums[r - 1]) r--;while (l < r && nums[l] == nums[l + 1]) l++;r--; l++;}}}return res;}
}
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i ++ ) {if (i - 1 >= 0 && nums[i] == nums[i - 1]) continue;for (int j = i + 1, k = nums.length - 1; j < k; j ++ ) {if (j > i + 1 && nums[j] == nums[j - 1]) continue;while (j < k - 1 && nums[i] + nums[j] + nums[k - 1] >= 0) k -- ;if (nums[i] + nums[j] + nums[k] == 0) {res.add(Arrays.asList(nums[i], nums[j], nums[k]));}}}return res;}
}

LeetCode 15. 三数之和【双指针】相关推荐

  1. Leetcode 15.三数之和 双指针 or 暴力哈希

    题目链接:传送门 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 暴力+ ...

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

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

  3. LeetCode 15三数之和16最接近的三数之和

    三数之和(双指针) 题意: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

  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. Java实现 LeetCode 15 三数之和

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

  6. LeetCode 15. 三数之和

    题目描述 15. 三数之和 思路 思路1 比较容易想到的就是,求三数之和等于0,可以等价于求两个数的和,然后看这个和的相反数是否在nums里面. 但是 T_T这样的话复杂度太高了,会超时,捂脸,最后三 ...

  7. Leetcode 15.三数之和

    Time: 20190920 Type: Medium 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所 ...

  8. Leetcode 15:三数之和(最详细解决方案!!!)

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

  9. 2021-5-11 Leetcode 15.三数之和

    1.1我的解法以及考虑到的几点问题 1)数组长度小于3的不用考虑,直接返回 2)暴力法:每一次查找不是自己选择的数字,看一下能否凑成零(但是这样不知道如何去重) 3)拆成一个数字+LC 1.两数之和的 ...

最新文章

  1. ASP.NET MVC5 Entity Framework CodeFirst(代码优先)
  2. 计算神经网络隐藏层节点数极小值
  3. SpringBoot+POI实现导入Excel时验证并返回错误Cell标红的文件
  4. 禁止USB存储设备。
  5. angular学习笔记(十九)-自定义指令修改dom
  6. 使用 XML 实现 REST 式的 SOA
  7. [Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正
  8. 【Python爬虫】BeautifulSoup4 库的一些用法
  9. 大数据时代,你的信息安全谁负责?
  10. mysql存储过程表迁移for_MySQL存储过程--通过游标遍历和异常处理迁移数据到历史表 (转)...
  11. 全面剖析Linux库文件路径的添加
  12. 实现mvcc_数据库中的引擎、事务、锁、MVCC(三)
  13. 【图像融合】基于matlab GUI小波变换可见光与红外光图像融合(带面板)【含Matlab源码 701期】
  14. log4j.properties打印日志
  15. 2021SC@SDUSC Zxing开源代码(十五)PDF417二维码(一)
  16. Word高效指南 - 中文文档首行自动缩进2个字符
  17. 零基础学前端难吗?前端好学吗?
  18. 计算机怎么搜索特定格式文件,win10 查找指定类型文件方法_win10怎么查找指定类型文件-win7之家...
  19. uni-app的发展和应用
  20. 24只胡萝卜的管理精神(节录)

热门文章

  1. 没法访问谷歌 wifi_如何设置Google WiFi系统
  2. Xray的安装与使用
  3. Aixcode的安装以及基本使用
  4. 什么蓝牙耳机好用?音质好佩戴舒适蓝牙耳机推荐
  5. 一个十分有趣的笑话:
  6. Spring Boot SpotBugs
  7. 【WZOI】奇葩的饭店
  8. 学会这几点让你的积分兑换商城火起来
  9. php+常用函数总结,php常用函数总结
  10. 随想daydayday