LeetCode做题总结 15. 三数之和、18. 四数之和 (Java)

news2025/1/11 12:47:29

不会做,参考了代码随想录和力扣官方题解,对此题进行整理。

X数之和

  • 15. 三数之和
    • 代码思路
    • 20240103重写
      • 错误1
      • 错误2
      • Java语言点总结
  • 18. 四数之和
    • 代码思路
    • 20240104
      • (伪)错误1 第一次剪枝
      • 错误2 第二次剪枝
      • 错误3 溢出

15. 三数之和

代码思路

思想:利用双指针法,对数组从小到大排序。先固定一个数,找到其他两个。

(1)首先对数组从小到大排序。
在这里插入图片描述
(2)a从左到右遍历数组,每一次遍历的时候设置left指针,right指针。num[a]+num[left]+num[right],如果值等于0,相当于找到了目标元组。如果值大于0,right–;如果值小于0,left++。

(3)涉及到去重的问题。a、left、right都会重复,具体请看下图(↑指a; -指left; =指right)。
在这里插入图片描述a去重:如果在这次循环之前,已经判断了三元组之一的元素num[a](不管是符合条件还是不符合条件,已经判断过这个元素),都跳过。if (num[a] >num[a-1]) continue;
为什么这里不用num[a]和num[a+1]比较,因为会出现元组 -1 -1 2。这是符合条件的。num[a] 和num[a-1]保证的是,在本次循环之前已经判断过这个元素;num[a]和num[a+1]比较还continue的话就是不允许三元组里有重复的元素。

left去重、right去重:找到一个目标元组之后,(且上一步a去重),现在要对left、right去重。如果num[left+1] =num[left], left++;如果num[right-1] =num[right], right–。

(4)技巧:三个数num[a]、num[left]、num[right]相加等于零,因为初始值 left=a+1,right=num.length-1,所以a<left<right这个等式恒成立。又因为num数组从小到大排序,三个数中最小的是a,如果a>0,那么一定不存在这个元组。

20240103重写

20240103第一次重写,错了很多,对着答案改。
语言是 java。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        // 不知道怎么初始化List<List<Integer>> ans = new ArrayList<ArrayList<Integer>>();
        List<List<Integer>> ans = new ArrayList<>();
        Arrays.sort(nums);//写错了Arrays.sort(),我写少了一个s

        int left,right;
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] > 0) {
                return ans;
            }

            if(i>0 && nums[i]==nums[i-1]) { //是i>0,不是i>1
                continue;
            }

            left = i+1;
            right = nums.length-1;
            while(left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                if(sum > 0) {
                    right--;
                } else if(sum < 0) {
                    left++;
                } else {
                    ans.add(Arrays.asList(nums[i], nums[left], nums[right]));//不会写
                    while(right > left && nums[left+1] == nums[left]) {left++;}//为什么要设置right > left
                    while(right > left && nums[right-1] == nums[right]) {right--;}

                    //漏写了。
                    right--; 
                    left++;
                }
            }
        }

        return ans;
    }
}

错误1

错误:我在代码中写了 List<List<Integer>> a=new ArrayList<ArrayList<Integer>>();
报错信息:ArrayList<ArrayList<Integer>> cannot be converted to List<List<Integer>>

List<List<Integer>>是在List1<>中再放一个List2<>,List1中每个List2的长度可以是任意的,而不是像二维数组那样维度固定。
List<List<Integer>> 的初始化为 List<List<Integer>> a=new ArrayList<List<Integer>>();

这个与泛型有关,但我还没学到那里,CSDN 有一篇文章讲的不错:跳转链接
在这里插入图片描述

错误2

有可能会出现 -2 1 1 1 1 1 1 1 的情况,所以 left++ right- -的时候一定要保证 left<right
在这里插入图片描述
在这里插入图片描述

Java语言点总结

  1. Arrays.sort()
  2. List<List<Integer>> 的初始化为 List<List<Integer>> a=new ArrayList<List<Integer>>();
  3. Arrays.asList() 该方法是将数组转化成List集合的方法
  4. List中 用add方法添加成员

18. 四数之和

代码思路

和三数之和一样。
五数、六数之和都是一样的。

20240104

又看了代码随想录的分析才写出来的。

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        Arrays.sort(nums); 

        for(int k = 0; k < nums.length; k++) { // nums.size 是否有必要?
            if(k > 0 && nums[k] == nums[k-1]) {
                continue;
            }

            if(nums[k]>0 && nums[k]>target) {//错了 if(target>0 && nums[k]>target)
                return ans;
            }//如果target小于零,nums[k]>target 不能跳过 [-4,-1,0,0] TARGET=-5
           
            for(int i = k+1; i < nums.length; i++) {
                if(i > k+1 && nums[i] == nums[i-1]) {
                    continue; // i=k+1,nums[k+1]=nums[k]不能跳过
                }

                if(nums[k]+nums[i]>target && nums[k]+nums[i]>=0) {
                    break;//这里是break不是return
                }

                int left = i+1;
                int right = nums.length-1;
                while(left < right) {
                    long sum =(long) nums[left] + nums[right] + nums[k] +nums[i];
                    if (sum > target) {
                        right--;
                    } else if (sum < target) {
                        left++;
                    } else {
                        ans.add(Arrays.asList(nums[k],nums[i],nums[left],nums[right]));
                        while(left < right && nums[left+1] == nums[left]) left++;
                        while(left < right && nums[right-1] == nums[right]) right--;

                        left++;
                        right--;
                    }
                }
            }
        }

        return ans;
    }
}

在这里插入图片描述

(伪)错误1 第一次剪枝

最开始写成: if(target>0 && nums[k]>target)
代码随想录写法:if(nums[k]>0 && nums[k]>target)
刚刚又试了一下,其实都是对的。之前报错是因为第二次剪枝的break和return出错。

错误2 第二次剪枝

最开始写成:

if(nums[k]+nums[i]>target && nums[k]+nums[i]>=0) {
  return;
}

正确写法:

if(nums[k]+nums[i]>target && nums[k]+nums[i]>=0) {
  break;
}

对比了代码随想录C++的代码(代码随想录Java的代码没有第二次剪枝),我一直以为是大于等于出错,或者是 &&的左右顺序出错,其实是 break和 return的区别。

错误3 溢出

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

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

相关文章

python中parsel模块的css解析

一、爬虫页面分类 1.想要爬取的内容全部在标签中&#xff0c;可以使用xpath去进行解析如下图 2.想要爬取的内容呈现json的数据特征&#xff0c;用.json()转换为字典格式 3.页面不规则&#xff0c;标签中包含大括号&#xff0c;如下面想要获取键值内容怎么做&#xff0c;先用re正…

Hive学习(13)lag和lead函数取偏移量

hive里面lag函数 在数据处理和分析中&#xff0c;窗口函数是一种重要的技术&#xff0c;用于在数据集中执行聚合和分析操作。Hive作为一种大数据处理框架&#xff0c;也提供了窗口函数的支持。在Hive中&#xff0c;Lag函数是一种常用的窗口函数&#xff0c;可以用于计算前一行…

R 批量对多个变量进行单因素方差分析 批量计算均值±标准差

多个变量批量进行单因素方差 R实现 文章目录 一、批量生成均值标准差 P值二、添加协变量单因素方差分析&#xff0c;生成校正P值三、在分层情况下进行单因素方差分析四、添加协变量和交互项的单因素方差分析&#xff0c;生成交互项的P值 一、批量生成均值标准差 P值 数据结构如…

设计模式之单例模式的懒饿汉

懒汉式 说白了就是你不叫我我不动&#xff0c;你叫我我才动。 类初始化模式&#xff0c;也叫延迟占位模式。在单例类的内部由一个私有静态内部类来持有这个单例类的实例。因为在 JVM 中&#xff0c;对类的加载和类初始化&#xff0c;由虚拟机保证线程安全。 public class Singl…

【Proteus仿真】【Arduino单片机】水箱液位监控系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LCD1602液晶、按键、蜂鸣器、液位传感器、ADC转换器、水泵等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示当前水位、上下限阈…

支持 input 函数的在线 python 运行环境 - 基于队列

支持 input 函数的在线 python 运行环境 - 基于队列 思路两次用户输入三次用户输入 实现前端使用 vue element uiWindows 环境的执行器子进程需要执行的代码 代码仓库参考 本文提供了一种方式来实现支持 input 函数&#xff0c;即支持用户输的在线 python 运行环境。效果如下图…

[NAND Flash 5.2] SLC、MLC、TLC、QLC、PLC NAND_闪存颗粒类型

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 前言 闪存最小物理单位是 Cell, 一个Cell 是一个晶体管。 闪存是通过晶体管储存电子来表示信息的。在晶体管上加入了浮动栅贮存电子…

网络调试 TCP,开发板用静态地址-入门7

用两台电脑&#xff08;无线网络&#xff09;做实验 1.1, 在电脑A上设置为Server如下&#xff1a; 选择TCP Server后&#xff0c;直接跳出用本机IP做为“本地主机地址” 1.2在 电脑B上设置为Client, 远程主机地址设置为Server的 IP 1.3, 在A, B两台电脑上能够互相发送数据 用…

Pyinstaller 打包的文件过大,根本原因在于包含了无用的依赖文件

环境要求&#xff1a;Windows&#xff0c;Pyinstaller 6.3.0 (不是这个版本的话&#xff0c;请逐步校对以下我在运行过程中的截图) 本文所使用代码不开源&#xff0c;觉得本文的思路可行的话&#xff0c;请加 QQ - 1398173074 购买 (&#xffe5;30&#xff0c;注明来意)&…

算力-计算量,关于TOPS和FLOPS,及FLOPs

目录 一、易混淆的三个点 二、芯片算力单位详解 四、模型算力单位详解 五、算力单位量级变换 六、计算机存储单位换算 七、科学计算单位换算 一、易混淆的三个点 关于TOPS和FLOPS&#xff0c;及FLOPs&#xff0c;这里有3个易混淆的点。 1、最大的混淆点&#xff0c…

MybatisPlus—快速入门

目录 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 1.2 定义Mapper 2.MybatisPlus常用注解 2.1 TableName 2.2 TableId 2.3 TableField 2.4 小结 3. 常用配置 4. 总结 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 MyBatisPlus官方提…

(04)刻蚀——选择刻蚀材料创建所需图形

01、光“堆叠”可不行 前期我们了解了如何制作“饼干模具”。本期,我们就来讲讲如何采用这个“饼干模具”印出我们想要的“饼干”。这一步骤的重点,在于如何移除不需要的材料,即“刻蚀(Etching)工艺”。 ▲ 图1: 移除饼干中间部分,再倒入巧克力糖浆 让我们再来回想一下…

im6ull学习总结(三-3)freetype

1、Freetype简介 FreeType是一个开源的字体渲染引擎&#xff0c;主要用于将字体文件转换为位图或矢量图形&#xff0c;并在屏幕上渲染出高质量的字体。它提供了一组API&#xff0c;使开发者能够在自己的应用程序中使用和呈现字体。 FreeType最初是作为一个独立项目开发的&…

基于X86的助力智慧船载监控系统

船载综合监控系统结合雷达、AIS、CCTV、GPS等探测技术&#xff0c;以及高度融合的实时态势与认知技术&#xff0c;实现对本船以及范围内船舶的有效监控&#xff0c;延伸岸基监控中心监管范围&#xff0c;保障行船安全&#xff0c;为船舶安全管理部门实现岸基可控的数据通信和动…

程序员必知!责任链模式的实战应用与案例分析

责任链模式让多个对象依次处理请求&#xff0c;降低发送者和接收者的耦合度&#xff0c;以在线购物为例&#xff0c;用户提交订单需经多步验证&#xff0c;通过责任链模式&#xff0c;验证器按顺序处理请求&#xff0c;先用户身份&#xff0c;再支付方式&#xff0c;最后配送地…

odoo16 连接postgresql错误

odoo16 连接postgresql错误 odoo16 用odoo15的环境出错&#xff0c;看到是psycopg2.OperationalError分析是postgresql版本问题&#xff0c;安装了13版本&#xff0c;还是出错&#xff0c;多版本共存问题如下&#xff1a; Traceback (most recent call last):File "D:\o…

@JsonFormat与@DateTimeFormat

JsonFormat注解很好的解决了后端传给前端的格式&#xff0c;我们通过使用 JsonFormat可以很好的解决&#xff1a;后台到前台时间格式保持一致的问题 其次&#xff0c;另一个问题是&#xff0c;我们在使用WEB服务的时&#xff0c;可 能会需要用到&#xff0c;传入时间给后台&am…

书生·浦语大模型实战营第一次课堂笔记

书生浦语大模型全链路开源体系。大模型是发展通用人工智能的重要途径,是人工通用人工智能的一个重要途径。书生浦语大模型覆盖轻量级、重量级、重量级的三种不同大小模型,可用于智能客服、个人助手等领域。还介绍了书生浦语大模型的性能在多个数据集上全面超过了相似量级或相近…

算法训练第六十天|84.柱状图中最大的矩形

84.柱状图中最大的矩形&#xff1a; 题目链接 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 : 输入&#xff1a;heights [2,1,5,6,2,3] 输出…

基于JavaWeb+SSM+Vue家政项目微信小程序系统的设计和实现

基于JavaWebSSMVue家政项目微信小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2…