threeSum

如果你还没有做过twoSum,建议去做一下

题目链接

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

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

  • 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
    满足要求的三元组集合为:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]
思路
  • 借鉴
  • 我在他的思想基础上加以优化,具体代码有注释。
代码
class Solution {
    public List> threeSum(int[] nums) {
        Arrays.sort(nums);
        List> lists = new ArrayList<>();
        int length = nums.length;
        for (int i = 0; i < length - 2; i++) {
            if (i != 0 && nums[i] == nums[i - 1])
                continue;
            if(nums[i]>0)
                break;
            int first = i + 1;
            int last = length - 1;
            while (first < last) {
                int sum = nums[i] + nums[first] + nums[last];
                if (sum == 0) {
                    lists.add(Arrays.asList(nums[i], nums[first], nums[last]));
                    /*
                        这个first++,last--,
                        如果我们当前匹配成功的话,为了避免重复,当前的两个搭档肯定是不能用的
                        所以这里first++,last--
                        当然你只写first++或者last--也是可以的,不过时间上可能会慢点
                     */
                    first++;
                    last--;
                    // 如果当前first和上一个我们已经匹配过first相等 first++
                    while (first < last && nums[first] == nums[first - 1])
                        first++;
                    // 如果当前last和上一个我们已经匹配过的last相等,last--
                    while (first < last && nums[last] == nums[last + 1])
                        last--;
                } else if (sum > 0&&first

发现leetcode的运行时间是飘忽不定的,有的时候很快,有的时候就很慢,我想刷一下时间也不能满足我的需求。

你可能感兴趣的:(LeetCode)