当前位置: 首页 > article >正文

剑指Offer|LCR 007. 三数之和

LCR 007. 三数之和

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

示例 2:

输入:nums = []
输出:[]

示例 3:

输入:nums = [0]
输出:[]

提示:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

法1:双指针

分析:

先对数组排序。

排序后遍历的指针的i,从0开始,left从i+1开始,right从末尾开始;当sum>0时,说明我们选的3个数太大了,需要一个更小一点的数,这个时候right往左移一下(right–操作);当sum<0时,说明我们选的3个数太小了,需要一个更大一点的数,这个时候left往右移一下(left++操作);当sum=0的时候,是我们要的,将他存入结果,找到了left也许左移,right右移,继续寻找下一个,这个时候,比较难想到去重b、c,hhh。这边去重,因为排过序了,所以只要比较相邻的元素。

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度 O ( n ) O(n) O(n)
var threeSum = function(nums) {
    let result = [];
    nums.sort((a, b) => a - b); // 排序
    
    for (let i = 0; i < nums.length; i++) {
        // 如果当前数字大于 0,则三数和必然大于 0,跳出循环
        if (nums[i] > 0) break;

        // 去重:如果当前数字与上一个相同,跳过
        if (i > 0 && nums[i] === nums[i - 1]) continue;

        let left = i + 1;
        let right = nums.length - 1;

        while (left < right) {
            const sum = nums[i] + nums[left] + nums[right];
            if (sum === 0) {
                // 找到一个三元组
                result.push([nums[i], nums[left], nums[right]]);
                
                // 去重:跳过重复的 left 和 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 result;
};

http://www.kler.cn/a/442718.html

相关文章:

  • 存储过程和触发器
  • 【计算机网络】深入浅出计算机网络
  • Vue 3前端与Python(Django)后端接口简单示例
  • 一个使用 Golang 编写的新一代网络爬虫框架,支持JS动态内容爬取
  • 日志系统实践
  • 软件工程和项目管理领域 - CMMI 极简理解
  • sunset: midnight
  • Elasticsearch Kibana (windows版本) 安装和启动
  • vue3-tp8-Element:对话框实现
  • TCP Analysis Flags 之 TCP Fast Retransmission
  • 【Unity功能集】TextureShop纹理工坊(二)图层(下)
  • 车辆重识别代码笔记12.18
  • JS的原型和原型链浅析
  • 深度学习中,卷积层的若干思考!!!
  • 【OSS】php使用oss存储
  • 【Elasticsearch】使用阿里云 infererence API 及 semantic text 进行向量搜索
  • 27.多态
  • DuckDB: 两种方法实现动态分组查询
  • 解决git push出现的报错:Permission denied (publickey)
  • 本地项目显示正常,打包部署后ElementUI重点饿图标全部显示异常为小方框
  • 天线覆盖方案简图
  • 云连POS-ERP管理系统ZksrService存在SQL注入漏洞
  • bug之浮点数精度求和计算
  • IntelliJ IDEA中的语言级别版本与目标字节码版本配置
  • c++数据结构算法复习基础--13--基数算法
  • STM32卡死、跑飞、进入HardFault_Handler如何精准的确定问题