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

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

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

思路:双指针法

要求的是a+b+c=0

1.首先可以先排序(O(nlogn)),这样保证数组有序之后可以利用大小关系判断。

2.设置两个指针start、end,分别从左边以及右边向中间遍历,如果找到a+b+c==0,那么可以将这个答案加入到答案集里 如果a+b+c<0,此时固定的是c,说明a+b太小了,因此start+=1;如果a+b+c>0,此时a+b过大,因此end-=1

3.去重,这一步则是利用了有序性,如果两个数相同,那他们在数组的位置一定是相邻的(连着几个数相同也是可能的),因此 去重的操作就能简单遍历一下相邻的是否相同即可。由于数组有序性使得去重这一步很简单,因此也可以看出第一步的作用。

提交的代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        int i,start=1,end=nums.length-1;
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        for(i=0;i<nums.length-2;i++)
        {
            if(i > 0 && nums[i] == nums[i-1]) continue; //去重
            start=i+1;
            end=nums.length-1;
            while(start<end)
            {
                if(nums[i]+nums[start]+nums[end]>0)
                {
                    end--;
                }
                else if(nums[i]+nums[start]+nums[end]<0)
                {
                    start++;
                }
                else
                {
                    List<Integer> list = new ArrayList<Integer>();
                    list.add(nums[i]);
                    list.add(nums[start]);
                    list.add(nums[end]);
                    result.add(list);
                    while (start<end && nums[start] == nums[start+1]) start++; // 去重
                    while (start<end && nums[end] == nums[end-1]) end--; // 去重
                    start++;
                    end--;
                }
            }
        }
        return result;
    }
}

Leetcode--15. 三数之和相关推荐

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

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

  2. LeetCode 15. 三数之和(3Sum)

    15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...

  3. Java实现 LeetCode 15 三数之和

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

  4. LeetCode 15. 三数之和【双指针】

    15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums[ ...

  5. LeetCode 15. 三数之和

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

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

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

  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.两数之和的 ...

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

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

最新文章

  1. 扎哈的绝唱:“六芒星”大兴机场的几何赏析
  2. NeurIPS 2019截稿期服务器被挤爆,投稿数增长40%创历史新高
  3. java中静态代码块的用法 static用法详解(转)
  4. linux hrtimer 绑定cpu,Linux hrtimer分析--未配置高精度模式
  5. 【转载】比特币入门教程
  6. MongoRepository自定义条件及分页查询代码
  7. html文字粒子效果简陋,5个很棒的CSS3文本粒子动画特效
  8. VS2010测试功能之旅:编码的“.NET研究”UI测试(2)-操作动作的录制原理(上)...
  9. 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
  10. appium java api文档_Appium常用API
  11. allergo 导出光辉配置_请教Allegro导出光绘文件的层要选择哪些层?
  12. 99%的程序都没有考虑的网络异常
  13. android 内存测试
  14. CABasicAnimation 按home键后台之后,再切回来动画就停止
  15. Windows10 快捷方式失效
  16. nodejs 安装教程
  17. c语言中e什么作用是什么,c语言中%e是什么意思
  18. 网易云易盾推出面向微信小程序的大数据反作弊产品
  19. ASP.NET Core 基础(十三)——模型绑定与模型验证
  20. 大漠插件ocr多选字库_易语言大漠插件模块制作设置字库及OcrEx识别字符串

热门文章

  1. LeetCode 290. 单词规律(哈希)
  2. LeetCode 179. 最大数(自定义谓词函数--Lambda表达式--排序)
  3. LeetCode 1002. 查找常用字符(哈希)
  4. 利python写用赌博游戏函数版赏析:
  5. Flink的ProcessFunction API
  6. linux python命令无反应_Python学习第164课--Linux命令行特殊符号的意义及命令的语法规则...
  7. word里双横线怎么打_美人计 | 精致打工人秀智,教你内双怎么化
  8. 模型训练太慢?显存不够用?这个算法让你的GPU老树开新花
  9. 要成为一个 Java 架构师得学习哪些知识以及方法?
  10. 论文小综 | Using External Knowledge on VQA