【LeetCode15】三数之和
- 三数之和
给你一个包含 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* 注意整型超过127后直接 == 会出错
* Arrays也有对数组的排序函数
**/
class Solution {public List<List<Integer>> threeSum(int[] nums) {return graceSolution(nums);}public List<List<Integer>> graceSolution(int[] nums) {// 特殊情况if (nums == null || nums.length < 3)return new ArrayList<>();//排序数组,只有排序后可以利用双指针移动的方式来达到目标值List<Integer> numsList = Arrays.stream(nums).boxed().collect(Collectors.toList());Collections.sort(numsList);ArrayList<List<Integer>> res = new ArrayList<>();//如果第一个元素都大于零直接返回空if (numsList.get(0) > 0) return res;ArrayList<Integer> temp = null;//固定i 然后利用R L指针来获取目标值(盛最多的水)for(int i = 0; i < numsList.size(); i++) {int l = i +1;int r = numsList.size() - 1;//如果当前元素都大于0了就不可能有结果了if(numsList.get(i)>0)return res;//如果当前元素有重复元素就可以直接跳过if(i>0 && numsList.get(i).equals(numsList.get(i - 1)))continue;while(l < r) {int curNum = numsList.get(i) + numsList.get(l) + numsList.get(r);if (curNum == 0) {temp = new ArrayList<>();temp.add(numsList.get(i));temp.add(numsList.get(l));temp.add(numsList.get(r));res.add(temp);//如果当前已经符合要求,那么当前l和r对应位置的值都不能再使用了,避免重复while(l < r && numsList.get(l).equals(numsList.get(l + 1)))l++;while(l < r && numsList.get(r).equals(numsList.get(r - 1)))r--;l++;r--;}else if (curNum > 0) {// 如果结果大于0, 那么需要将r--才可能使得结果减少,因为目前数组已经排序r--;}elsel++;}}return res;}public List<List<Integer>> other(int[] nums) {List<List<Integer>> lists = new ArrayList<>();//排序Arrays.sort(nums);//双指针int len = nums.length;for(int i = 0;i < len;++i) {if(nums[i] > 0) return lists;if(i > 0 && nums[i] == nums[i-1]) continue;int curr = nums[i];int L = i+1, R = len-1;while (L < R) {int tmp = curr + nums[L] + nums[R];if(tmp == 0) {List<Integer> list = new ArrayList<>();list.add(curr);list.add(nums[L]);list.add(nums[R]);lists.add(list);while(L < R && nums[L+1] == nums[L]) ++L;while (L < R && nums[R-1] == nums[R]) --R;++L;--R;} else if(tmp < 0) {++L;} else {--R;}}}return lists;}
}
【LeetCode15】三数之和相关推荐
- LeetCode15. 三数之和 16. 最接近的三数之和
LeetCode15. 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组 ...
- [Swift]LeetCode15. 三数之和 | 3Sum
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- leetcode15. 三数之和(三指针)
一:题目 二:思路 1.这里的去重是指的是我们在遍历元素的时候,遇到相同的挨着的相同的元素的时候要跳过 2.对元素进行排序,为了后面的比较 3.我们用的是三个指针,第一个指针i指向第一个元素,第二个指 ...
- leetcode15 三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- leetcode15. 三数之和(详解)
一:题目 二:上码 class Solution {public:/**思路:1.这个题出其不意之处在于,其先对这个序列进行了排序排序的好处是1>:如果首元素是大于0的,那么如果无论无何也凑不出 ...
- Leetcode--15. 三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- [230420 leetcode15] 三数之和
题目描述 原题链接 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums ...
- LeetCode--15.三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums[i] + nums ...
- LeetCode 15. 三数之和(3Sum)
15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...
最新文章
- 换个角度聊系统稳定性建设
- T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响...
- 计算机科学与技术社会实践报告,计算机科学与技术系社会实践报告
- 连续 3 天,企业容器应用实战营上海站来啦!
- 海上瓶子下有东西吗_小小的瓶盖竟有如此大的作用, 闻名不如眼见, 你知道吗?...
- 怎么给自己的python换源_windows/linux下如何更换Python的pip源
- 我的物联网项目(十二) 单体应用架构不行?
- 黄聪:VS2017调试时提示“运行时无法计算表达式的值”
- 如何制作一个塔防游戏 Cocos2d x 2 0 4
- oracle 存储结构 语法 第一阶段
- 自动化运维工具SaltStack
- 此工作簿已丢失了其VBA项目 Activex控件以及其他任何与可编程序性相关的功能...
- BZOJ3687 简单题
- java获取pdf的属性_Java 文件属性.pdf
- 已知两点坐标和半径,求圆心
- 计算机中1kb等于多少字节,1kb等于多少个字节
- 新知实验室--腾讯云TRTC体验
- 20 周年会上的这条视频,看哭了 10 万阿里人
- 台湾BSMI认证的三种申请方式及产品
- u盘文件变成快捷方式怎么恢复,恢复U盘文件的五种方法