【LeetCode】第18题. 四数之和

  今日学习的文章链接和视频链接

leetcode题目地址:第18题. 四数之和

 代码随想录题解地址:代码随想录

题目简介

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

看到题目的第一想法(可以贴代码)

1. 参考三数之和,排序+双重遍历+双元素+双指针(含去重)。

        去重的逻辑我想不清楚:拿草稿纸慢慢想,写出来了。

public List<List<Integer>> fourSum(int[] nums, int target) {Arrays.sort(nums);int len = nums.length;int sum = 0;int left = 0, right = 0;List<List<Integer>> res = new ArrayList<>();for (int i = 0; i < len - 3; i++){if (i > 0 && nums[i] == nums[i - 1]) continue;for (int j = i + 1; j < len - 2; j++){left = j + 1;right = len - 1;while (left < right){sum = nums[i] + nums[j] + nums[left] + nums[right];if (sum == -294967297 ||sum == -294967296) return res;if (sum == target){res.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));while (left < right && nums[left] == nums[left + 1]) left++;while (left < right && nums[right] == nums[right - 1]) right--;left++;right--;if (nums[left - 1] == nums[j]){while (j < len - 2 && nums[j] == nums[j + 1]) j++;j--;}else {while (j < len - 2 && nums[j] == nums[j + 1]) j++;}}else if (sum < target){left++;}else if (sum > target){right--;}}}}return res;
}

实现过程中遇到哪些困难

1. int类型最大值和最小值分别为2147483647, -2147483648;如果超出最大值会变为-294967297和 -294967296,不太懂它的原理,要不是补码,要不是力扣自定义。

看完代码随想录之后的想法

【解题思路】参考三数之和,二重剪枝+二重去重。

【想法】

1. 关于超出int的表示范围:可以将sum设为long类型,同时sum赋值前也要加(long),强制转换

2. 关于我思考的-1,-1,-1,3和-1,-1,0,2,前两个数两次取-1,-1的情况,可以在底下的while里实现。

3. 两次剪枝,我直接省略了。

看完视频自己写的ACC:

public List<List<Integer>> fourSum(int[] nums, int target) {Arrays.sort(nums);int len = nums.length;long sum = 0;int left = 0, right = 0;List<List<Integer>> res = new ArrayList<>();for (int i = 0; i < len - 3; i++){if (nums[i] > 0 && nums[i] > target) return res;if (i > 0 && nums[i] == nums[i - 1]) continue;for (int j = i + 1; j < len - 2; j++){if (j > i + 1 && nums[j] == nums[j - 1]) continue;left = j + 1;right = len - 1;while (left < right){sum = (long) nums[i] + nums[j] + nums[left] + nums[right];if (sum == target){res.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));while (left < right && nums[left] == nums[left + 1]) left++;while (left < right && nums[right] == nums[right - 1]) right--;left++;right--;}else if (sum < target){left++;}else if (sum > target){right--;}}}}return res;
}

学习时长

碎片化,不记录


今日收获

1. 变量定义不要放在最前面,哪里用得到就在哪里定义,重复定义了也没事。。?

2. 代码风格:()和 {} 前后都要预留空格。

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

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

相关文章

【SpringBoot】之Mybatis=Plus集成及使用(入门级)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之Mybatis-Plus系列》。&#x1…

MySQL数据存储、索引记录

行格式(每行记录) 行格式(每行记录)&#xff1a; 以记录为单位来向表中插入数据的&#xff0c;这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式。 InnoDB 存储引擎4种不同类型的 行格式 &#xff0c;分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行格式。组…

git 的使用

git reset详解-CSDN博客 git reset 命令详解 git revert命令详解。-CSDN博客 关于Git分支中HEAD和Master的理解 - 知乎 (zhihu.com) 一文带你精通 Git&#xff08;Git 安装与使用、Git 命令精讲、项目的推送与克隆&#xff09;-CSDN博客 Git 常用操作&#xff08;5&#xff…

SpringMVC上传下载文件解读

知识点 文件上传&#xff08;File Upload&#xff09;&#xff1a; 创建一个控制器方法&#xff0c;使用 MultipartFile 参数来接收上传的文件。在 Spring 配置文件中配置一个 MultipartResolver&#xff0c;常用的实现类是 CommonsMultipartResolver。在 MultipartResolver …

ORDER BY和ROW_NUMBER() OVER (ORDER BY ...)区别?SQL

在 SQL 查询中&#xff0c; ORDER BY 子句用于指定排序的字段以及排序的顺序&#xff08;升序或降序&#xff09;&#xff0c; 而 ROW_NUMBER() OVER (ORDER BY ...) 则用于为每一行分配一个唯一的序号&#xff0c;并且这个序号是基于指定的排序字段和排序顺序计算的。当然&a…

laravel8模块化开发laravel-modules

laravel8模块化开发laravel-modules 在laravel目录下打开git输入两行命令 $ composer require nwidart/laravel-modules $ php artisan module:make Admin 这个Admin就是文件名

day 18二叉树(五)

day18 代码随想录 2023.12.16 1. 513找树左下角的值 这道题很直观的就是想到层序遍历&#xff0c;最后一层的第一个节点值就是我们需要的&#xff0c;而且很偷懒的是&#xff0c;不用判断是不是最后一层&#xff0c;每一层第一个节点值都保存&#xff0c;会覆盖&#xff0c;最…

Mybatis配置-类型别名(typeAliases)

在Java中&#xff0c;类型别名&#xff08;Type Alias&#xff09;是一个用于简化某个类型的名称的方式。它在XML配置中特别有用&#xff0c;可以减少在全限定类名上繁琐的重复输入。例如&#xff1a; <typeAliases><typeAlias alias"Author" type"do…

grep -B指定输出前置行

要在grep命令输出关键字所在行的同时&#xff0c;再输出关键字的上两行&#xff0c;可以使用grep的-B选项来指定前置行数。下面是一个示例的代码&#xff1a; grep -B 2 "Unsuccessful" shyn在这个示例中&#xff0c;我们使用grep命令过滤出包含"Unsuccessful&q…

用Pyinstaller打包深度学习算法为独立的可执行程序

前言&#xff1a;随着深度学习算法的流行&#xff0c;在传统工业软件计算领域&#xff0c;传统算法逐渐被深度学习算法给代替&#xff0c;但由于基于python的深度学习算法十分依赖python环境以及例如Pytorch、Scikit-learning、Keras等机器学习库&#xff0c;将深度学习算法运用…

西南科技大学数字电子技术实验五(用计数器设计简单秒表)预习报告

一、计算/设计过程 说明&#xff1a;本实验是验证性实验&#xff0c;计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程&#xff0c;越详细越好。用公式输入法完成相关公式内容&#xff0c;不得贴手写图片。&#xff08;注意&#xff1a;从抽象公式直接得出结…

UE5 PlaceActor

⚠️ 重点 PlaceActors 需在引擎初始化之后 但&#xff0c;单为这一个功能&#xff0c;更改整个模块的启动顺序&#xff0c;也不太划算 更好的办法是&#xff0c;启动顺序保持正常&#xff08;如"LoadingPhase": "Default" &#xff09;&#xff0c;然后…

Java EE 多线程之线程安全的集合类

文章目录 1. 多线程环境使用 ArrayList1. 1 Collections.synchronizedList(new ArrayList)1.2 CopyOnWriteArrayList 2. 多线程环境使用队列2.1 ArrayBlockingQueue2.2 LinkedBlockingQueue2.3 PriorityBlockingQueue2.4 TransferQueue 3. 多线程环境使用哈希表3.1 Hashtable3.…

innerHTML、innerText、textContent有什么区别

innerHTML、innerText、textContent有什么区别 在 HTML 中&#xff0c;innerHTML、innerText、 和textContent是 DOM&#xff08;文档对象模型&#xff09;的属性。它们允许我们读取和更新 HTML 元素的内容。 但它们在包含的内容以及处理 HTML 标签的方式有不同的行为。 读完…

分布式事务seata使用示例及注意事项

分布式事务seata使用示例及注意事项 示例说明代码调用方&#xff08;微服务A&#xff09;服务方&#xff08;微服务B&#xff09; 测试测试一 &#xff0c;seata发挥作用&#xff0c;成功回滚&#xff01;测试二&#xff1a;处理feignclient接口的返回类型从Integer变成String,…

【Spring Boot】快速入门

一、引言 1、什么是spring boot&#xff1f; Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff…

LEFT JOIN 避坑指南

left join 通俗的解释&#xff1a;以左表为主表&#xff0c;返回左表的所有行&#xff0c;如果右表中没有匹配&#xff0c;则依然会有左表的记录&#xff0c;右表字段用null填充。 准备数据 假设有一个班级管理应用&#xff0c;有一个表classes&#xff0c;存了所有的班级&am…

【RocketMQ-Install】Windows 环境下安装 RocketMQ 及基础命令的使用

【RocketMQ-Install】Windows 环境下 安装本地 RocketMQ 及基础命令的使用 1&#xff09;下载 RocketMQ 安装包1.1.官网下载&#xff08;推荐&#xff09;1.2.Git 下载1.3.安装环境要求说明 2&#xff09;Windows 安装3&#xff09;基础命令测试 1&#xff09;下载 RocketMQ 安…

芯知识 | 什么是音频蓝牙播放语音芯片?

随着科技的不断进步&#xff0c;音频蓝牙播放语音芯片成为嵌入式音频系统中备受关注的创新解决方案。本文将深入解析什么是音频蓝牙播放语音芯片&#xff0c;以及其在实现无线音频体验方面的重要作用。 一、什么是音频蓝牙播放语音芯片&#xff1f; 音频蓝牙播放语音芯片是一…

Java:SpringBootTest指定profile

示例 指定使用test环境配置 SpringBootTest ActiveProfiles("test") public class APiServiceImplTest {}参考 spring boot-JUnit Test指定profile