LeetCode15. 三数之和
本文最后更新于 960 天前,其中的信息可能已经有所发展或是发生改变。

一、思路

分治:将问题拆解为两数之和加第三个数

二、问题

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

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

 

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

示例 2:

输入:nums = []
输出:[]

示例 3:

输入:nums = [0]
输出:[]

 

提示:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105
Related Topics
  • 数组
  • 双指针
  • \n

  • 👍 3004
  • 👎 0
  • 三、代码

            private List<List<Integer>> ans = new ArrayList<>();
    
            public List<List<Integer>> threeSum(int[] nums) {
                // 排序是为了使用双指针求和
                Arrays.sort(nums);
                // 分解为两数之和+第三个数,这个循环是第三个数的取值
                for (int i = 0; i < nums.length-2; i++) {
                    // 由于和为零,并且每次运算时第三个数的下标最小,所以第三个数不可能大于0
                    if (nums[i]>0){
                        break;
                    }
                    // 排除第三个数重复的情况,另外两数也会做类似处理
                    if (i > 0 && nums[i] == nums[i - 1]) {
                        continue;
                    }
                    twoSum(nums, -nums[i], i + 1);
                }
                return ans;
            }
    
            public void twoSum(int[] numbers, int target, int start) {
                int left = start;
                int right = numbers.length - 1;
                // 双指针求和
                while (left < right) {
                    int sum = numbers[left] + numbers[right];
                    if (sum > target) {
                        right--;
                    } else if (sum < target) {
                        left++;
                    } else {
                        List<Integer> list = new ArrayList<>();
                        list.add(numbers[start - 1]);
                        list.add(numbers[left]);
                        list.add(numbers[right]);
                        ans.add(list);
                        // 去重
                        while (left < right && numbers[left] == numbers[++left]);
                        while (left < right && numbers[right] == numbers[--right]);
                    }
                }
            }
    
    作者:Yuyy
    博客:https://yuyy.info
    暂无评论

    发送评论 编辑评论

    
    				
    |´・ω・)ノ
    ヾ(≧∇≦*)ゝ
    (☆ω☆)
    (╯‵□′)╯︵┴─┴
     ̄﹃ ̄
    (/ω\)
    ∠( ᐛ 」∠)_
    (๑•̀ㅁ•́ฅ)
    →_→
    ୧(๑•̀⌄•́๑)૭
    ٩(ˊᗜˋ*)و
    (ノ°ο°)ノ
    (´இ皿இ`)
    ⌇●﹏●⌇
    (ฅ´ω`ฅ)
    (╯°A°)╯︵○○○
    φ( ̄∇ ̄o)
    ヾ(´・ ・`。)ノ"
    ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
    (ó﹏ò。)
    Σ(っ °Д °;)っ
    ( ,,´・ω・)ノ"(´っω・`。)
    ╮(╯▽╰)╭
    o(*////▽////*)q
    >﹏<
    ( ๑´•ω•) "(ㆆᴗㆆ)
    😂
    😀
    😅
    😊
    🙂
    🙃
    😌
    😍
    😘
    😜
    😝
    😏
    😒
    🙄
    😳
    😡
    😔
    😫
    😱
    😭
    💩
    👻
    🙌
    🖕
    👍
    👫
    👬
    👭
    🌚
    🌝
    🙈
    💊
    😶
    🙏
    🍦
    🍉
    😣
    Source: github.com/k4yt3x/flowerhd
    颜文字
    Emoji
    小恐龙
    花!
    上一篇
    下一篇