📜  Java |数组|问题5(1)

📅  最后修改于: 2023-12-03 15:15:58.397000             🧑  作者: Mango

Java 数组问题5

在Java中,数组也是一种非常重要的数据结构。下面是关于数组的问题和解决方法:

问题描述

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

示例:

输入: nums = [-1, 0, 1, 2, -1, -4]
输出: [[-1, 0, 1], [-1, -1, 2]]
解决方法

思路

  • 首先对数组进行排序;
  • 然后从左到右开始遍历数组,取出当前元素作为三元组的第一个数字,即a;
  • 在剩下的元素中找出两个数字,使得它们的和等于 -a ,即 b+c=-a。这就转化为了一个求两数之和的问题;
  • 由于题目要求每个三元组不能重复,我们需要过滤重复的元素。

代码实现

public List<List<Integer>> threeSum(int[] nums) {
    List<List<Integer>> res = new ArrayList<>();

    if(nums == null || nums.length<3) return res;

    Arrays.sort(nums);

    for(int i=0;i<nums.length-2;i++) {
        if(i>0 && nums[i]== nums[i-1]) {
            continue;
        }

        int left = i+1, right = nums.length-1;

        while(left<right) {
            int sum = nums[i]+nums[left]+nums[right];

            if(sum == 0) {
                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(sum<0) left++;
            else right--;
        }
    }

    return res;
}

复杂度分析

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n)
总结

这道题目考察了对数组排序、指针的理解和思维转化能力。希望大家掌握之后可以灵活使用相关的思路和解法。