LeetCode_15

LeetCode_15

  • 题意以及限制条件
  • 想到的所有可能解法
  • 对应的代码
  • 测试样例

题意以及限制条件

  1. 题目:LeetCode_15_第1张图片
    LeetCode_15_第2张图片

  2. 限制条件:
    在这里插入图片描述

想到的所有可能解法

  • Ways——排序+双指针

    1. 时间复杂度——O( n 2 n^2 n2);空间复杂度——O(1);
    2. 首先对数组进行排序,排序后固定一个数 nums[i];
    3. 再使用左右指针指向 nums[i]后面的两端,数字分别为 nums[left] 和 nums[right];
    4. 如果 nums[i]大于 0,则三数之和必然无法等于 0,结束循环;
    5. 如果 nums[i] == nums[i−1],则说明该数字重复,会导致结果重复,所以应该跳过;
    6. 计算后两个数的和并判断是否为 target,满足则添加进结果集:
      • 当 nums[i] + nums[j] == 0 时,且nums[left] == nums[left+1] 则会导致结果重复,应该跳过,left++;
      • 当 nums[i] + nums[j] == 0 时,且nums[right] == nums[right-1] 则会导致结果重复,应该跳过,right−−。

对应的代码

  • Ways
class Solution {
     
    public List<List<Integer>> threeSum(int[] nums) {
     

        int len = nums.length;
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if (nums == null || len <= 0) return res;
        Arrays.sort(nums);
        for (int i = 0; i < len; ++i) {
     
            if (nums[i] > 0) break;
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            int left = i + 1, right = len - 1;
            int target = 0 - nums[i];
            while (left < right) {
     
                if (nums[left] + nums[right] == target) {
     
                    res.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    while (left < right && nums[left] == nums[left + 1]) ++left;
                    while (left < right && nums[right] == nums[right - 1]) --right;
                    ++left;--right;
                }else if (nums[left] + nums[right] < target) ++left;
                else --right;
            }
        }
        return res;

    }
}

测试样例

LeetCode_15_第3张图片

你可能感兴趣的:(LeetCode,leetcode,算法,java)