博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode:15. 3Sum(Medium)
阅读量:5738 次
发布时间:2019-06-18

本文共 1909 字,大约阅读时间需要 6 分钟。

1. 原题链接

2. 题目要求

数组S = nums[n]包含n个整数,请问S中是否存在a,b,c三个整数,使得a+b+c=0。找出所有满足该条件的三元组,且不包含重复三元组。

3. 解题思路

首先对数组进行排序

思路一:三层for循环暴力解决,同时考虑过滤重复,时间复杂度为O(n3)

思路二:时间复杂度为O(n2),外面一层for循环,以每个元素 nums[i] 作为三元组重的一个元素,然后从剩余的元素中找出二者之和满足0-nums[i]的两个元素。通过一层while循环,从剩余所有元素的首位两个元素开始找,不断向中间逼近。

过滤重复:因为已经对数组进行排序,所以相同的整数一定会连在一起。当使用for循环进行遍历时,如果当前指向元素 nums[i] 与 nums[i-1]相同,则可跳出本次循环,执行 i++,从而达到过滤重复的目的。

4. 代码实现

 

import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;import java.util.List;public class ThreeSum15 {    public static void main(String[] args) {        int[] nums = {-5, -2, -2, -2, -4, 4, 0, 5};        for (int i = 0; i < ThreeSum15.threeSum(nums).toArray().length; i++) {            System.out.println(ThreeSum15.threeSum(nums).get(i));        }    }    public static List
> threeSum(int[] nums) { Arrays.sort(nums); List
> ls = new LinkedList<>(); for (int i = 0; i < nums.length - 2; i++) { if (i == 0 || (i > 0 && nums[i] != nums[i - 1])) { // 跳过可能重复的答案 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) { while (l < r && nums[l] == nums[l + 1]) l++; // 跳过重复值 l++; } else { while (l < r && nums[r] == nums[r - 1]) r--; r--; } } } } return ls; }}

  

转载于:https://www.cnblogs.com/huiAlex/p/8078911.html

你可能感兴趣的文章
ProbS CF matlab源代码(二分系统)(原创作品,转载注明出处,谢谢!)
查看>>
OC中KVC的注意点
查看>>
JQ入门(至回调函数)
查看>>
【洛天依】几首歌的翻唱(无伴奏)
查看>>
OpenSSL初瞻及本系列的博文的缘由
查看>>
ISO8583接口的详细资料
查看>>
tmux不自动加载配置文件.tmux.conf
查看>>
经验分享:JavaScript小技巧
查看>>
[MOSEK] Stupid things when using mosek
查看>>
程序实例---栈的顺序实现和链式实现
查看>>
服务的使用
查看>>
Oracle 用户与模式
查看>>
MairDB 初始数据库与表 (二)
查看>>
拥在怀里
查看>>
chm文件打开,有目录无内容
查看>>
whereis、find、which、locate的区别
查看>>
一点不懂到小白的linux系统运维经历分享
查看>>
桌面支持--打不开网页上的pdf附件解决办法(ie-tools-compatibility)
查看>>
nagios监控windows 改了NSclient++默认端口 注意事项
查看>>
干货 | JAVA代码引起的NATIVE野指针问题(上)
查看>>