其他分享
首页 > 其他分享> > LeetCode15:三数之和

LeetCode15:三数之和

作者:互联网

1.题目来源

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

链接:https://leetcode-cn.com/problems/3sum/

2.解题思路

a.这个题目的重点在于不重复,凡是要求不重复的题目,都可以使用先排序,Array.sort()大法真好用,嘻嘻。然后按照顺序一个个来的方法,这样就不会有重复的组合了。

b.首先找出第一个数,然后剩下两个数之和就是第一个的相反数。基于此,剩下两个数的寻找可以使用寻找两数之和为固定数的算法。

c.寻找两数之和为固定数可以先排序,然后用双指针找。

d.也就是在数组中要找到3个数,这个3个数之间可以重复,但是每一个的取值不能重复。

3.代码展示

public class Solution {

    public static List<List<Integer>> threeSum(int[] nums) {
        int numLength = nums.length;
        List<List<Integer>> result = new ArrayList<>();
        if (numLength == 0) {
            return result;
        }
        // 1.排序
        Arrays.sort(nums);
        for (int first = 0; first < numLength; ++first) {
            // 第一个数只能取一次,所以不能和上一个相等
            if (first > 0 && nums[first] == nums[first - 1])
                continue;
            int third = numLength - 1;

            int target = -nums[first];
            for (int second = first + 1; second < numLength; ++second) {
                // 第二个数也只能取一次,所以不能和上一个相等,second > first + 1是因为是每一位数的取值不相同,但是不同位数之间可以相同
                if (second > first + 1 && nums[second] == nums[second - 1])
                    continue;
                // second和third还没相遇,并且两数之和大于目标值,让third减小以寻找目标值
                while (second < third && nums[second] + nums[third] > target) {
                    third--;
                }
                // 两个指针都相遇了仍然比目标值大,说明找不到那个数
                if (second == third) {
                    break;
                }
                // 寻找到对应的数字和为目标值
                if (nums[second] + nums[third] == target) {
                    List<Integer> template = new ArrayList<>();
                    template.add(nums[first]);
                    template.add(nums[second]);
                    template.add(nums[third]);
                    result.add(template);
                }
            }

        }
        return result;
    }

    public static void main(String[] args) {
        int[] array = {-1, 0, 1, 2, -1, -4};
        List<List<Integer>> result = threeSum(array);
        System.out.println(result);
    }
}

写完代码写用例要写多个,除了题目中给出的,至少要加上特殊值用例,如:空数组

标签:result,third,nums,int,三数,second,LeetCode15,first
来源: https://www.cnblogs.com/neverland0718/p/14448957.html