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

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

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(),我写少了一个sint 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>1continue;}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 > leftwhile(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=-5for(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.hqwc.cn/news/326793.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 创建组件组件

组件&#xff1a;用于将某个功能的 HTML、CSS、JS 封装到一个文件中&#xff0c;提高代码的复用性和可维护性。 创建组件 一、在根目录中创建 components 文件夹&#xff0c;右键点击新建组件。 二、输入组件名称、选择默认模板、点击创建组件。 三、在组件中正常编写内容即可…

java基础之Java8新特性-Stream(流)

简介 流&#xff08;Stream&#xff09;是 Java 8 引入的一种处理集合数据的抽象概念&#xff0c;它提供了一种更简洁、更灵活的方式来操作和处理集合数据。流可以看作是一系列元素的管道&#xff0c;可以对这些元素进行筛选、转换、排序、归约等操作&#xff0c;实现各种数据…

Java爬虫之Jsoup

1.Jsoup相关概念 Jsoup很多概念和js类似&#xff0c;可参照对比理解 Document &#xff1a;文档对象。每份HTML页面都是一个文档对象&#xff0c;Document 是 jsoup 体系中最顶层的结构。 Element&#xff1a;元素对象。一个 Document 中可以着包含着多个 Element 对象&#…

分析C++软件问题的常用分析工具及案例集锦详解

目录 1、库依赖关系查看工具Dependency Walker 2、GDI对象查看工具GDIview 3、PE信息查看工具PeViewer/MiTeC EXE Explorer 4、进程信息查看工具Process Explorer 5、进程监控工具Process Monitor 6、API函数调用监测工具API Monitor C软件异常排查从入门到精通系列教程&…

SpringBoot 调用mybatis报错:Invalid bound statement (not found):

启动SpringBoot报错&#xff1a;Invalid bound statement (not found): 参考此文排查 命中了第6条 记录一手坑爹的Invalid bound statement (not found)&#xff08;六个方面&#xff09; mapper文件路径配置错误 订正以后 问题解决

从Spring Cloud Alibaba开始聊架构

作为SpringCloudAlibaba微服务架构实战派上下册和RocketMQ消息中间件实战派上下册的作者胡弦。 另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.htmlhttps://item.jd…

IP2312U_VSET 5V 2A 单节锂电池同步开关降压充电IC

IP2312U是一款5V输入&#xff0c;支持单节锂电池同步开关降压充电管理的IC。 IP2312U集成功率MOS&#xff0c;采用同步开关架构&#xff0c; 使其在应用时仅需极少的外围器件&#xff0c;并有效减小整体方案的尺寸&#xff0c;降低BOM 成本。 IP2312U的升压开关充电转换器工作频…

用友U8+CRM 逻辑漏洞登录后台漏洞复现

0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件&#xff0c;旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 reservationcomplete.php文件存在逻辑漏洞&#xff0c;未授权的攻击者通过…

JVM知识总结(简单且高效)

1. JVM内存与本地内存 JVM内存&#xff1a;受虚拟机内存大小的参数控制&#xff0c;当大小超过参数设置的大小时会报OOM。本地内存&#xff1a;本地内存不受虚拟机内存参数的限制&#xff0c;只受物理内存容量的限制&#xff1b;虽然不受参数的限制&#xff0c;如果所占内存超过…

从零开始的OpenGL光栅化渲染器构建1

前言 参照Learnopengl&#xff0c;我开始回顾OpenGL中的内容&#xff0c;最终目标是构建一个玩具级的光栅化渲染器&#xff0c;最好还能和之前做的光线追踪渲染器相结合&#xff0c;希望能够有所收获吧~ 包管理 之前我用CMake配置过OpenGL的环境&#xff0c;这样做出来的项目…

【Python机器学习】线性模型——岭回归

岭回归也是一种用于回归的线性模型&#xff0c;它的预测公式与线性回归相同&#xff0c;但是在岭回归里&#xff0c;对于系数的选择不仅要在训练数据上得到好的预测结果&#xff0c;而且还要拟合附加约束&#xff0c;还希望系数尽量小&#xff0c;这意味着每个特征对输出的影响…

实现文本 内容展开 / 收起

<template><el-table :data"tableData" style"width: 100%" height"250"><el-table-columnfixedprop"date"label"日期"width"150"></el-table-column><el-table-columnprop"name…