每日一题——三数之和

菜鸡每日一题系列打卡15

每天一道算法题目 

小伙伴们一起留言打卡

坚持就是胜利,我们一起努力!

题目描述(引自LeetCode)

给你一个包含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) {


        // 特殊情况处理
        if (nums == null || nums.length < 3) {
            return new ArrayList<>();
        }


        // 数组排序
        Arrays.sort(nums);
        List> result = new ArrayList<>();


        for (int i = 0; i < nums.length && nums[i] <= 0; i++) {
            // 去重
            if(i > 0 && nums[i] == nums[i-1]) continue;
            // 首指针起始位置
            int start = i + 1;
            // 尾指针起始位置
            int end = nums.length - 1;
            while (start < end) {
                int sum = nums[i] + nums[start] + nums[end];
                if (sum == 0) {
                    result.add(Arrays.asList(nums[i], nums[start], nums[end]));
                    // 首指针去重
                    while (start < end && nums[start] == nums[start + 1]) start++;
                    // 尾指针去重
                    while (start < end && nums[end] == nums[end - 1]) end--; 
                    start++;
                    end--;
                } else if (sum < 0) {
                    start++;
                } else {
                    end--;
                }
            }
        }


        return result;


    }
    
}

代码分析

对代码进行分析,首先对数组进行排序,时间复杂度是O(nlogn),接下来针对每个数字进行三数之和的匹配,时间复杂度是O(n^2),因此,整体的时间复杂度为O(n^2),就空间而言,在不考虑返回结果所占用空间的情况下,空间复杂度为O(1)。

执行结果

每日一题——三数之和_第1张图片

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

你可能感兴趣的:(算法)