两数之和、三数之和、四数之和

目录

两数之和

题目链接

题目描述

思路分析

代码实现

三数之和

题目链接

题目描述

思路分析

代码实现

四数之和

题目链接

题目描述

思路分析

代码实现


两数之和

题目链接

LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)

题目描述

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

示例 1:

输入:price = [3, 9, 12, 15], target = 18
输出:[3,15] 或者 [15,3]

示例 2:

输入:price = [8, 21, 27, 34, 52, 66], target = 61
输出:[27,34] 或者 [34,27]

思路分析

题目要求我们找到两个价格之和刚好为 target 的商品,且只需要返回任意一组结果

我们可以使用暴力枚举的方式,列出所有的两个数字的组合,判断这两个数字的和是否等于目标值

但是,此时的时间复杂度为 O(N^2),且会超时

由于数组是升序的,因此,我们可以使用 对撞指针 来解决这个问题

我们定义两个指针,分别指向数组的最左端和最右端

若 nums[left] + nums[right] < target,此时 nums[right] 为最大值,不能再增加了,因此我们需要让 nums[left] 变大,因此 left++,让 nums[left] 增加

若 nums[left] + nums[right] > target,此时 nums[left] 为最小值,不能再减小了,因此,我们让 right--,减小 nums[right] 的值,从而让两数之和减小

若 nums[left] + nums[right] = target,说明找到结果了,记录结果并返回即可

接下来,我们就来尝试编写代码

代码实现

class Solution {public int[] twoSum(int[] price, int target) {int len = price.length;int left = 0, right = len - 1;while(left < right) {if (price[left] + price[right] < target) {left++;} else if(price[left] + price[right] > target) {right--;} else {return new int[] {price[left], price[right]};}}return new int[2];}
}

三数之和

题目链接

15. 三数之和 - 力扣(LeetCode)

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

思路分析

题目要求我们找到 所有和为 0 且不重复的三元组,相比于上述的两数之和,此时我们要找到所有和为0的三元组,且不能重复

我们同样可以利用 对撞指针 的思想来解决这个问题

由于数组不是有序的,因此,我们先对其进行排序

接着,由于要找三个数,因此,我们可以先固定一个数 nums[k],此时就需要找到两个数,它们的和 target 为 -nums[k]

若 nums[left] + nums[right] < target,left++

若 nums[left] + nums[right] > target,right--

若  nums[left] + nums[right] =  target,找到一组和为 0 的三元组,但是,在 [left + 1, right - 1] 区间内可能还存在和为 target 的二元组,因此 left++,right--

但是,由于不能出现重复的三元组,因此,我们需要对其进行 去重 操作

当找到一个结果时,left 和 right 都需要跳过重复的元素

此外,当结束完一次循环后,固定的 k 也需要进行去重操作

在分析完解题思路之后,我们就来尝试编写代码解决问题 

代码实现

class Solution {public List<List<Integer>> threeSum(int[] nums) {int len = nums.length;List<List<Integer>> ret = new ArrayList<>();// 对元素进行排序Arrays.sort(nums);for(int i = 0; i < len - 2; ) {int target = 0 - nums[i];int left = i + 1;int right = len - 1;while(left < right) {int sum = nums[left] + nums[right];if(sum > target) {right--;} else if(sum < target) {left++;} else {ret.add(new ArrayList<Integer>(Arrays.asList(nums[i], nums[left], nums[right])));// 继续找left++;right--;// 去重while(left < right && nums[left] == nums[left - 1]) {left++;}while(left < right && nums[right] == right + 1) {right--;}}}// 去重i++;while(i < len && nums[i] == nums[i - 1]) {i++;}}return ret;}
}

四数之和

题目链接

18. 四数之和 - 力扣(LeetCode)

题目描述

给你一个由 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:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

思路分析

在解决了三数之和问题之和,四数之和就变得非常简单,我们只需要:

(1)对数组进行排序

(2)固定a 位置的数

(3)在数a的前面区间上,利用三数之和找到三个数,使得这三个数的和等于 target - nums[a] 即可

 

代码实现

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> ret = new ArrayList<>(); int len = nums.length;if(len < 4) {return ret;}// 排序Arrays.sort(nums);int i = 0;while(i < len - 3) {int j = i + 1;while(j < len - 2) {int left = j + 1;int right = len - 1;long t = (long)target - nums[i] - nums[j];while(left < right) {if(nums[left] + nums[right] < t) {left++;} else if(nums[left] + nums[right] > t){right--;} else {ret.add(new ArrayList<Integer>(Arrays.asList(nums[i], nums[j], nums[left], nums[right])));// 去除左边重复元素left++;while(left < right && nums[left] == nums[left - 1]) {left++;}// 去除右边重复元素right--;while(left < right && nums[right] == nums[right+1]) {right--;}}}j++;while(j < len - 2 && nums[j] == nums[j - 1]) {j++;}}i++;while(i < len - 3 && nums[i] == nums[i - 1]) {i++;}}return ret;}
}

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

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

相关文章

文心快码太牛啦

在工作中遇到这种重复性的文本处理&#xff0c;可以使用问心快码帮助提升工作效率&#xff0c;把自己从重复劳动中解放出来。在写代码的时候也可以使用问心快码&#xff0c;比如&#xff1a; 1、每次对函数进行命名的时候就很头疼&#xff0c;能否出一个函数命名的快捷入口&…

国央企如何完善黑名单排查体系?

国央企完善黑名单排查体系的关键在于建立健全的供应商管理机制、风险评估体系和信息共享平台。以下是一些具体措施&#xff1a; 1.建立黑名单库&#xff1a;国央企可以依据外部黑名单数据&#xff08;如政府监管部门、行业协会、第三方征信机构公布的黑名单&#xff09;和内部…

如何编写高质量的用户故事

本文详细介绍了如何在敏捷开发过程中编写高质量用户故事&#xff08;User Story&#xff09;&#xff0c;包括用户故事的定义、结构、撰写技巧以及如何与产品待办列表&#xff08;Product Backlog&#xff09;中的其他工作项&#xff08;PBI&#xff09;相结合&#xff0c;以提…

自动化学习2:pytest的高级用法(mark标记/fixture/hook)

一.mark的用法 概念&#xff1a;Pytest提供的mark标记&#xff0c;允许我们标记测试函数&#xff0c;测试类和整个模块。通过不同的标记实现不同的运行策略&#xff0c;如标记冒烟测试用例。 1.注册标记 可以在pytest.ini文件注册自定义标记 除了自己注册的标记外&#xff0…

Android 深层链接利用

为了能够从我们的应用程序打开另一个应用程序&#xff0c;我们通常通过声明我们想要访问的 Activity 类的名称来实现这一功能。但是&#xff0c;如果我们要打开的 Activity 在其清单文件中设置了android:exported"false" &#xff0c;则无法使用此方法。而其中一种替…

Open3D(C++) 基于点云的曲率提取特征点(自定义阈值法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接,首发于:2024年9月23日。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、算法原理 点云的曲率反映了点云表面的凹凸程度,根据点云曲率的分布情况,设置合适的阈值,提取…

安畅检测受邀参与“长清区数字化转型企业对接会”

9月11日下午&#xff0c;长清区工信局召开“长清区数字化转型企业对接会”&#xff0c;链接数字化服务商与亟待数字化升级的企业代表&#xff0c;共商推进数字化诊断等事项&#xff0c;安畅检测数字化诊断项目负责人受邀出席本次会议。 会上&#xff0c;长清区工信局相关负责人…

性能测试问题诊断-接口耗时高

问题现象&#xff1a;近期发现每晚跑的定时压测任务&#xff0c;压测结果中&#xff0c;各接口耗时变高&#xff08;原来99耗时<3秒&#xff0c;当前99耗时>20秒)。 问题排查&#xff1a; 查看jmeter 生成的结果图&#xff0c;发现压测2分钟后出现接口耗时变高情况。如下…

安装一个本地大模型

详细的教程基于 AnythingLLM 及 Ollama 构建本地知识库 - knqiufan - 博客园 安装本地大模型之后&#xff0c;用如下方式启动 ollama run deepseek-v2:16b。

海豚调度运行成功但无法生成实例解决

海豚调度运行成功但无法生成实例解决 问题描述 点击运行&#xff0c;提示运行成功但无法在工作实例中看到 问题定位 查看资源监控&#xff0c;内存占用80% 查看master日志 tail -f /home/dolphinscheduler/tmp/dolphinscheduler/master-server/logs/dolphinscheduler-m…

Webpack 介绍

Webpack 介绍 Date: August 29, 2024 全文概要 Webpack概念&#xff1a; Webpack是一个静态的模块化的打包工具&#xff0c;可以为现代的 JavaSript 应用程序进行打包。 1-静态&#xff1a;Webpack可以将代码打包成最终的静态资源 2-模块化&#xff1a;webpack支持各种模块…

【Python报错已解决】AttributeError: ‘Tensor‘ object has no attribute ‘kernel_size‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

【JS】forEach中push为何不会陷入死循环,稀疏数组空元素为何不会被遍历

前言 使用 forEach 时&#xff0c;遇到过如下几个问题 为什么稀疏数组空元素不会被遍历 为什么每次循环时 push 不会陷入死循环 为什么使用splice删除元素后&#xff0c;访问不到下一位元素 溯源 查阅 ecma官方文档&#xff0c;使用ECMA-262, 14th edition, June 2023版 …

【深度估计】【深度学习】Windows11下Dynamic-multiframe-depth代码Pytorch官方实现与源码讲解

【深度估计】【深度学习】Windows11下Dynamic-multiframe-depth代码Pytorch官方实现与源码讲解 提示:最近开始在【光流估计】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录 【深度估计】【深度学习】Windows11下Dynamic-multiframe-depth代码Pyt…

JDBC PreparedStatement解决SQL注入方案

文章目录 获取PreparedStatement对象PreparedStatement是如何解决SQL注入问题的PreparedStatement的 应用上述如何解决sql注入的问题呢&#xff1f; 获取PreparedStatement对象 PreparedStatement是Statement的子接口&#xff0c;可以防止sql注入问题。可以通过Connection接口…

耳夹式耳机哪个品牌好?热门品牌机型推荐

在移动互联网时代&#xff0c;耳机已然成为很多人生活里不可或缺的电子产品。不管是在上下班的途中&#xff0c;还是进行运动的时候&#xff0c;耳机都能为人们带来音乐的美妙享受&#xff0c;起到减轻压力的作用。 可是&#xff0c;长时间佩戴入耳式耳机存在一些弊端&#xf…

【无人机设计与控制】使用凸优化的无人机在存在威胁区域时的路径规划

摘要 本文提出了一种基于凸优化的无人机路径规划方法&#xff0c;旨在解决无人机在威胁区域中飞行的最优路径问题。该方法通过构建威胁区域的凸集表示&#xff0c;并结合凸优化算法&#xff0c;确保无人机能够在避开威胁区域的同时&#xff0c;沿着最优路径到达目标点。仿真结…

Ubuntu的源管理详解

Ubuntu的源管理详解 Ubuntu软件源是存储Ubuntu软件包的服务器&#xff0c;通过这些源&#xff0c;用户可以下载、安装或更新软件包。这篇文章将详细介绍Ubuntu如何查看、添加、修改和删除源&#xff0c;以及如何解决源相关的问题。 什么是软件源&#xff1f; Ubuntu软件源是…

无人机之编程基础原理

无人机编程基础原理涉及多个方面&#xff0c;主要包括无人机的基本原理、飞行控制算法、编程语言及算法应用等。以下是对这些方面的详细阐述&#xff1a; 一、无人机基本原理 无人机的基本原理是理解其结构、飞行原理、传感器和控制系统等的基础。无人机通常由机身、动力系统&…

中国山东著名国学大师起名专家颜廷利:人类的终极使命,超越地球的探索之旅

中国山东著名国学大师起名专家颜廷利&#xff1a;人类的终极使命,超越地球的探索之旅 人类的存在&#xff0c;不是为了留恋地球&#xff0c;而是为了离开地球…&#xff08;升命学说&#xff09; 安徽阜阳、海口、滁州、宜春、河南周口、新乡、茂名、宁夏.银川最好的专业取名…