【LeetCode】升级打怪之路 Day 07:nSum 问题

news2025/1/28 1:04:59

今日题目:

  • 15. 三数之和 | LeetCode
  • 18. 四数之和 | LeetCode
  • 454. 四数相加 II | LeetCode
  • 383. 赎金信 | LeetCode

目录

    • Problem 1:nSum 问题 【必会】
      • LC 15. 三数之和 【classic, important】
      • LC 18. 四数之和 【classic, important】
    • Problem 2:Other
      • LC 454. 四数相加 II 【还行】
      • LC 383. 赎金信 【easy】

今天学习的重点在于 nSum 问题,即如何使用双指针法解决 2sum 问题,然后再基于 2sum 解决 3sum、4sum 问题。

Problem 1:nSum 问题 【必会】

这是 LeetCode 上一个经典的问题,包括 2sum、3sum 以及 4sum 等,解决这类问题的关键是:使用双指针法解决 2sum 问题,基于此,对于 3sum 问题来说,就是固定一个 number 然后转化为 2sum 问题;对于 4sum 问题来说,就是固定一个 number 然后转化为 3sum 问题

nSum 问题的通用解法的讲解可以参考 一个函数秒杀 2Sum 3Sum 4Sum 问题 | labuladong 文章。

理解这个问题有两个关键点

  1. 如何使用双指针法解决 2sum 问题
  2. 如何基于 2sum 解决 3sum 问题

这里有两个易错点(亲身经历):

  1. 一定要先对 nums 进行排序,才能使用双指针法来解

对 nums 排序
2. 指针滑动时,注意跳过重复数字,并且要保证跳跃正确,这里很容易因为一些细节导致小错误

跳过重复数字的逻辑可以写成:

while ( i+1 在合法范围内  &&  nums[i + 1] == nums[i] ) {
    i++;
}
i++;

以上伪代码中,while 循环跳到了重复数字的最后一个,最后一行 i++ 使其跳过了重复数字。注意这里的最后的 i++ 别忘了。

LC 15. 三数之和 【classic, important】

15. 三数之和 | LeetCode

按照前面介绍的,我们需要实现一个 twoSumQuestion() 函数来解决 2sum 问题,然后基于此函数来进一步解决 3sum 问题。其中在解决 2sum 问题时,使用双指针来解决。

所以 Solution 代码的大致框架如下

class Solution {
	private List<List<Integer>> twoSumQuestion(int[] nums, int target, int start, int end) {
		// 双指针法解决 2sum 问题
		return results;
	}
	
	public List<List<Integer>> threeSum(int[] nums) {
		Arrays.sort(nums);  // 对 nums 排序
		
		// ************
		// 基于 2sum 函数解决 3sum 问题
		// ************
		
		return results;
	}
}

我的具体实现代码如下:

class Solution {
    private List<List<Integer>> twoSumQuestion(int[] nums, int target, int start, int end) {
        if (start >= end || start >= nums.length || end > nums.length) {
            return null;
        }
        int left = start, right = end - 1;
        List<List<Integer>> result = new ArrayList<>();
        while (left < right) {
            int sum = nums[left] + nums[right];
            if (sum == target) {
                result.add(List.of(nums[left], nums[right]));
                // left 跳过重复值
                while (left + 1 < right && nums[left + 1] == nums[left]) {
                    left++;
                }
                left++;
                // right 跳过重复值
                while (right - 1 > left && nums[right - 1] == nums[right]) {
                    right--;
                }
                right--;
            } else if (sum < target) {
                left++;
            } else {
                right--;
            }
        }
        return result;
    }

    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> results = new ArrayList<>();
        int i = 0;
        while (i < nums.length - 2) {
            int num = nums[i];
            var twoSumAnswer = twoSumQuestion(nums, 0 - num, i + 1, nums.length);
            twoSumAnswer.forEach(answer -> {
                results.add(List.of(num, answer.get(0), answer.get(1)));
            });
            while (i + 1 < nums.length - 2 && nums[i + 1] == nums[i]) {
                i++;
            }
            i++;
        }
        return results;
    }
}

LC 18. 四数之和 【classic, important】

18. 四数之和 | LeetCode

类比上一个三数之和题目,这个解题思路也是类似,先使用双指针法实现 2sum 问题,基于 2sum 实现 3sum,然后再基于 3sum 实现 4sum 问题。

class Solution {

    private List<List<Integer>> twoSumQuestion(int[] nums, long target, int start, int end) {
        // 使用双指针法实现 2sum 问题
        return results;
    }

    private List<List<Integer>> threeSumQuestion(int[] nums, long target, int start, int end) {
        // 基于 2sum 实现 3sum
        return results;
    }

    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);  // 对 nums 排序
        // 基于 3sum 实现 4sum
        return results;
    }
}

框架是这样,但其中仍存在不少细节,所以还是要亲自多写写。

Problem 2:Other

LC 454. 四数相加 II 【还行】

454. 四数相加 II | LeetCode

这个就和前面的 nSum 不是同一个思路了,主要考察如何使用 HashMap 来降低算法的复杂度,整体略微具有难度。

LC 383. 赎金信 【easy】

题目很容易,直接跳过即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1474236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3DIoUMatch: Leveraging IoU Prediction for Semi-Supervised 3D Object Detection

3DIoUMatch: Leveraging IoU Prediction for Semi-Supervised 3D Object Detection 论文链接&#xff1a;https://arxiv.org/pdf/2012.04355.pdf 代码链接&#xff1a;https://github.com/yezhen17/3DIoUMatch 作者单位&#xff1a;Stanford University等 发表平台&#xff1a;…

Terra Photos再升级,春节照片整理新选择

今年春节那叫一个热闹非凡 像今年火到英国的英歌舞小马也看了好几场 照片、视频咔咔拍 想家的时候点开视频仿佛又回到了春节 什么&#xff1f; 你问我视频太多了不够存怎么办&#xff1f; 嘿你可别忘了我是做什么的 铁威马NAS来帮你 之前跟大家介绍过铁威马独家应用 Te…

Python中各种符号的意义

Python中的各种符号总结如下&#xff1a; 运算符 描述实例算术运算符加 - 两个对象相加a b 输出结果 30-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200/除 - x除以yb / a 输出结果 2%取模 - 返回…

uniapp的微信小程序授权头像昵称(最新版)

前面我出过两期博客关于小程序授权登录,利用php实现一个简单的小程序授权登录并存储授权用户信息到数据库的完整流程。无奈&#xff0c;小程序官方又整幺蛾子了。wx.getUserInfo接口收回&#xff0c;wx.getUserProfile接口也不让用。导致我的个人小程序&#xff1a;梦缘 的授权…

微服务-实用篇

微服务-实用篇 一、微服务治理1.微服务远程调用2.Eureka注册中心Eureka的作用&#xff1a;搭建EurekaServer服务Client服务注册服务发现Ribbon负载均衡策略配置Ribbon配置饥饿加载 3.nacos注册中心使用nacos注册中心服务nacos区域负载均衡nacos环境隔离-namespaceNacos和Eureka…

如何将本地项目上传到github上

将本地项目上传到github上有很多种方法&#xff0c;这里只讲述我认为最简单快捷的一种&#xff0c;先在github中创建一个仓库&#xff0c;接着在本地建文件夹&#xff0c;用命令行将项目推送到本地仓库&#xff0c;然后连接远程仓库&#xff0c;将本地项目推送到远程仓库上。要…

成功解决[!] CocoaPods could not find compatible versions for pod “sqflite“

当pod install时出现下面的错误&#xff1a; Analyzing dependencies [!] CocoaPods could not find compatible versions for pod "sqflite": In Podfile:sqflite (from .symlinks/plugins/sqflite/darwin)Specs satisfying the sqflite (from .symlinks/plugins…

【leetcode热题】杨辉三角 II

难度&#xff1a; 简单通过率&#xff1a; 41.1%题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个非负索引 k&#xff0c;其中 k ≤ 33&#xff0c;返回杨辉三角的第 k 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 示…

基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

就业班 2401--2.26 Linux Day5--进程管理一

一、权限扩展 文件权限管理之&#xff1a; 隐藏权限防止root误删除 文件属性添加与查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件属性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ----------------…

2024022601-数据库语言SQL

数据库语言SQL SQL的发展 1974年&#xff0c;由Boyce和Chamberlin提出 1975~1979&#xff0c;IBM San Jose Research Lab的关系数据库管理系统原型System R实施了这种语言 SQL-86是第一个SQL标准 SQL-89、SQL-92(SQL2)、SQL-99(SQL3) 非过程化语言 SQL语言进行数据库操作…

Android 框架设计模板

不同项目在使用该模板时多少会有出入&#xff0c;应以项目实际情况作为依据。 &#xff08;该文档可以 .md 格式存放于项目根目录&#xff0c;或编写到readme 中&#xff09; 项目描述 涉及如下方面 项目背景 &#xff08;可引用项目立项书&#xff09;项目需求 &#xff08…

小技巧:Nuxt处理全局组件的显示与隐藏

在Nuxt开发过程中&#xff0c;大家会遇到需要控制全局组件的显示与隐藏。比如说移动端的路由导航栏、头部的返回操作。。。 为了使切换页面的同时&#xff0c;确定是否展示全局组件&#xff0c;保证页面展示的平稳过渡。 下面是我在项目中用到一个办法&#xff0c;已实现。 …

formality:set_constant应用

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章链接: formality:形式验证流程 scan mode func的功能检查需要把scan mode设置成0。

petalinux烧写image.ub报错

xinlinx SDK烧写petalinux生成的BOOT.BIN和image.ub时&#xff0c;BOOT.BIN烧写正常&#xff0c;image.ub烧写报错如下 Erase Operation failed. INFO: [Xicom 50-44] Elapsed time 0 sec.ERROR: Flash Operation Failed串口助手操作擦除flash如图&#xff1a; 解决方法&am…

【自然语言处理四-从矩阵操作角度看 自注意self attention】

自然语言处理四-从矩阵操作角度看 自注意self attention 从矩阵角度看self attention获取Q K V矩阵注意力分数softmax注意力的输出再来分析整体的attention的矩阵操作过程从矩阵操作角度看&#xff0c;self attention如何解决问题的&#xff1f;W^q^ W^k^ W^v^这三个矩阵怎么获…

Visual Studio:Entity设置表之间的关联关系

1、选择表并右键-》新增-》关联 2、设置关联的表及关联关系并“确定”即可

ZTE E8820V2重启偶现5G wifi丢失问题

使用ZTE E8820V2设备时,发现设备在多次重启过程中会出现5G wifi信号丢失的情况。 1. 现象日志 使用老毛子固件,具体丢失时会出现相关log: 2. 问题原因: GPIO#19 是 PCIE reset 外,GPIO#26 也要 reset。 3. 解决方法: E8820V2/rt-n56u/trunk$ git diff linux-3.4.x…

AI一键生成原创文案,方法很简单!

AI一键生成原创文案&#xff0c;方法很简单&#xff01;你会不会觉得文案很难写&#xff1f;你会不会因为要写文案很烦恼&#xff1f;对于这些写作问题&#xff0c;在技术快速发展的今天&#xff0c;我们都可以迎刃而解了&#xff01;一键生成原创文案&#xff0c;它能帮助所有…

js 实战小案例

实战 时间 js 格式化时间 <script type"text/javascript">function formatDate(date) { let year date.getFullYear(); let month String(date.getMonth() 1).padStart(2, 0); // getMonth() 返回的月份是从0开始的&#xff0c;所以要加1&#xff0c;并…