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

leetcode15-三数之和

leetcode 15
在这里插入图片描述

思路

时间复杂度:O(n2) 空间复杂度:O(logn)+O(k)

本题主要考虑使用双指针法解答,遍历i的时候i固定,然后定义两个指针left和right,通过移动left和right来使得总和相加为0,但是有个**前提是需要先将数组进行排序。排序完以后的数组,如果总和发现过小那么我们左指针右移动,因为越向右值越大,如果总和过大,那么右指针左移,找到总和为0,把这三个元素放入答案中。
在不断移动的过程中很重要的一个细节:
去重**,因为题目中有说明不可以包含重复的三元组,就是当已经出现过例如[-1,-1,2]这个答案以后,后面不能再出现这个答案,我们对于i,left,right都需要进行去重,i循环的时候如果i的前一个数和当前数是相等我们就要continue,因为如果当前的值和之前的值一样的话,那么后续遍历过的元素,在前一个值那里已经完全遍历过一遍,所以不需要再进行遍历,同样left如果和前一个元素一样,right和后一个元素一样时也是直接continue
在这里插入图片描述
图片来自代码随想录

实现

var threeSum = function (nums) {
    // 排序
    nums.sort((a, b) => a - b)
    let result = [];
    for (let i = 0; i < nums.length - 2; i++) {
        if (nums[i] > 0) return result;
        // 去重,如果下一个遍历的元素和上一个元素相等,那么后续的元素其实是已经遍历过了
        if (i > 0 && nums[i] === nums[i - 1]) {
            continue;
        }
        let left = i + 1, right = nums.length - 1;
        while (left < right) {
            // 去重
            if (left > i + 1 && nums[left] === nums[left - 1]) {
                left++;
                continue
            }
            if (right < nums.length - 1 && nums[right] === nums[right + 1]) {
                right--;
                continue;
            }
            let sum = nums[left] + nums[right] + nums[i]
            if (sum === 0) {
                // 目标值
                result.push([nums[i], nums[left], nums[right]])
                left++
            } else if (sum < 0) {
                // 和小了,那么需要把left右移,让总体值变大
                left++;
            } else {
                // 和大了
                right--;
            }
        }
    }
    return result;
};

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

相关文章:

  • 在CentOS服务器上部署DeepSeek R1
  • 可被electron等调用的Qt截图-录屏工具【源码开放】
  • 【算法设计与分析】实验7:复杂装载及0/1背包问题的回溯法设计与求解
  • pytorch生成对抗网络
  • 蓝桥杯算法笔记|差分学习
  • C语言【基础篇】之流程控制——掌握三大结构的奥秘
  • 【AudioClassificationModelZoo-Pytorch】基于Pytorch的声音事件检测分类系统
  • Rust中的切片类型:灵活的数据视图
  • LeetCode 0680.验证回文串 II:两侧向中间,不同就试删
  • 订单状态监控实战:基于 SQL 的状态机分析与异常检测
  • 树莓派pico入坑笔记,睡眠
  • go-zero学习笔记(三)
  • 院校联合以项目驱动联合培养医工计算机AI人才路径探析
  • 【Linux网络编程】:守护进程,前台进程,后台进程
  • C++哈希表深度解析:从原理到实现,全面掌握高效键值对存储
  • Mac M1 Comfyui 使用MMAudio遇到的问题解决?
  • 【C++】B2122 单词翻转
  • 【C++篇】位图与布隆过滤器
  • 毫秒级响应的VoIP中的系统组合推荐
  • 【DeepSeek背后的技术】系列一:混合专家模型(MoE)
  • 从零开始实现一个双向循环链表:C语言实战
  • Java多线程——对象的组合
  • FPGA|例化生成的PLL功能IP核
  • 为什么在Rust中要用Struct和Enum组织数据?
  • MySQL锁类型(详解)
  • React+Cesium基础教程(003):加载3D建筑物和创建标签