Leetcode 15. 三数之和

236 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、题目描述

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

二、思路分析

  • 这道题我们先将数组排好序,接着还是利用双指针进行求解!
    • 首先数组第一位固定第二位最后一位我们定义为首尾指针
    • 三数相加,结果大于0,则尾指针减一(排序后数组从小到大,所以尾指针向左移动越小)
    • 三数相加,结果小于0,则头指针加一(排序后数组从小到大,所以头指针向右移动和越大)
    • 如果没有符合的条件,固定的下标头指针向前加一,重复上述操作

三、AC 代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        int target = 0;
        Arrays.sort(nums);
        //不足三个数直接返回    
        if(nums.length < 3) return result;

        for(int i = 0; i < nums.length; i++){
            //相同的数跳过,不需要再次计算
            if(i > 0 && nums[i] == nums[i - 1])continue;
            int j = i + 1;
            int k = nums.length - 1;
            while(j < k){
                if(nums[i] + nums[j] + nums[k] < target){
                    j++;
                    //相同的数跳过,不需要再次计算
                    while(j < k && nums[j] == nums[j - 1])j++;
                }else if(nums[i] + nums[j] + nums[k] > target){
                    k--;
                    while(j < k && nums[k] == nums[k + 1])k--;
                }else{
                    result.add(Arrays.asList(nums[i], nums[j], nums[k]));
                    j++;
                    k--;
                    while(j < k && nums[j] == nums[j - 1])j++;
                    while(j < k && nums[k] == nums[k + 1])k--;
                }
            }
        }
        return result;
    }
}


四、总结:

  • 好了,代码撸完,我们总结一下
    • 这道题运用了双指针的解法
    • 细节,要注意先给数组排序,否则指针移动没有意义
    • 锁定一个数,其他两个数移动即可
    • 三数之和大于目标值,则尾指针向左反之首指针向右
    • 相等的数值跳过,因为已经比过了,没有意义

最后这个算法是Leetcode的第15题,是热题100的第8题,去年我刷了热题100用时一个月左右,接下来我会继续更新,小伙伴可以点赞关注,如果你也在刷热题100的话,希望可以对你有一些启发!