【二分查找】LCR 007. 三数之和

LCR 007. 三数之和

解题思路

  • 定义:定义一个名为Solution的类,并且在这个类中维护一个成员变量res,用于存储所有满足条件的三元组。
  • 主方法:threeSum方法是解决问题的入口点。它调用threeSumTarget方法来计算所有和为0的三元组。
  • 转化为两数之和:threeSumTarget方法首先对输入数组nums进行排序,然后遍历每个元素nums[i],并把问题转化为找出数组中的两个数,使得两数之和为target - nums[i]。这是因为我们希望nums[i] + nums[j] + nums[k] == target,即如果确定了nums[i],我们只需要在剩下的数组中找到两个数之和为target - nums[i]。
  • 寻找两数之和:使用twoSumTarget方法来找出所有和为特定target值的元素对。因为数组已经排序,所以可以用双指针技术,一个从剩余数组的起始位置开始,一个从数组结束的位置开始遍历。
  • 去重:在threeSumTarget和twoSumTarget方法中,该代码使用while循环来跳过重复的元素,以避免在结果集res中出现重复的三元组。
    收集结果:每当在twoSumTarget找到符合条件的元组时,就会创建一个新的数组a,将成对的元素(也就是找到的两个数)添加到a中,然后将nums[i](当前遍历的元素)添加到a,最后将完整的三元组添加到结果列表res中。
    返回结果:最后返回填充好的结果列表res,它包含了所有不重复的符合条件(三个数之和等于目标值target)的三元组
class Solution {List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> threeSum(int[] nums) {// 遍历数组的每一个元素 nums[i]// 针对每一个元素 计算 和为 -nums[i]的两个元素return threeSumTarget(nums,0);}List<List<Integer>> threeSumTarget(int[] nums,int target){// 首先对数组进行排序Arrays.sort(nums);for(int i = 0; i < nums.length; i++){List<List<Integer>> temp = twoSumTarget(nums,i + 1,target - nums[i]);// 满足条件的temp有多个for(List<Integer> t:temp){t.add(nums[i]);res.add(t);}while(i < nums.length - 1 && nums[i] == nums[i + 1]){i++;}}return res;}List<List<Integer>> twoSumTarget(int[] nums,int start,int target){List<List<Integer>> res = new ArrayList<>();int left = start;int right = nums.length - 1;while(left < right){int sum = nums[left] + nums[right];// 记录当前地 左边界和右边界元素int l = nums[left];int r = nums[right];if(sum == target){List<Integer> a = new ArrayList<>();a.add(nums[left]);a.add(nums[right]);res.add(a);while(left < right && nums[left] == l){left++;// 剔除重复的元素}while(left < right && nums[right] == r){right--;}}else if(sum < target){while(left < right && nums[left] == l){left++;// 剔除重复的元素}}else if(sum > target){while(left < right && nums[right] == r){right--;}}}return res;}}

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

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

相关文章

Sentinel注解@SentinelResource详解

Sentinel注解SentinelResource详解 熔断 针对访问超过限制【sentinel中配置的限制】的资源&#xff0c;通过java代码配置&#xff0c;返回一个自定义的结果&#xff0c;需要用到 SentinelResource 注解的 blockHandlerClass 和 blockHandler 属性。 blockHandlerClass&#…

数据集合

目录 并集 union union all 区别 交集 intersect 差集 minus 错误操作 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 常用的数学集合有&#xff1a;交集、并集、差集、补集 每一次查询实际上都会返回数据集合&#xff0c;…

摆花(洛谷)

题目 原题 题目描述 小明的花店新开张&#xff0c;为了吸引顾客&#xff0c;他想在花店的门口摆上一排花&#xff0c;共 m m m 盆。通过调查顾客的喜好&#xff0c;小明列出了顾客最喜欢的 n n n 种花&#xff0c;从 1 1 1 到 n n n 标号。为了在门口展出更多种花&#xf…

IEEE Sensors Journal 投稿记录

好幸运&#xff0c;过年一个月连中两篇论文。IEEE Sensors Journal是中科院二区期刊&#xff0c;这次投稿体验感觉不错&#xff0c;遂记录于下。 2024年2月17接收&#xff0c;方向和期刊高度匹配&#xff08;传感器&#xff0c;软件硬件创新均有&#xff09;&#xff0c;速度非…

2402C++,C++的反向代理

原文 cinatra支持反向代理很简单,5行代码就可以了.先看一个简单的示例: #include "cinatra/coro_http_reverse_proxy.hpp" using namespace cinatra; int main() {reverse_proxy proxy_rr(10, 8091);proxy_rr.add_dest_host("127.0.0.1:9001");proxy_rr.a…

1401:机器翻译

分析&#xff1a;模拟题&#xff0c;用vector模拟队列实现 指向queue队首的l指针&#xff0c;指向queue队尾的r指针&#xff08;用push_back()代替也一样&#xff09; 指针更新情况为&#xff1a; 搜索有单词&#xff0c;不做处理搜索无单词&#xff0c;判断内存长度&#x…

【机器学习】机器学习常见算法详解第4篇:KNN算法计算过程(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习&#xff0c;伴随浅显易懂的数学知识&#xff0c;让大家掌握机器学习常见算法原理&#xff0c;应用Scikit-learn实现机器学习算法的应用&#xff0…

房屋租赁系统的Java实战开发之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

第11章 GUI

11.1 Swing概述 Swing是Java语言开发图形化界面的一个工具包。它以抽象窗口工具包&#xff08;AWT&#xff09;为基础&#xff0c;使跨平台应用程序可以使用可插拔的外观风格。Swing拥有丰富的库和组件&#xff0c;使用非常灵活&#xff0c;开发人员只用很少的代码就可以创建出…

免费申请一个美国EDU学生邮箱

EDU邮箱的作用 例如大名鼎鼎的GitHub学生包。包含各种服务器的优惠卷&#xff0c;可以让你免费使用1-2年的服务器。免费的域名。免费的网站证书。太多了。 微软&#xff1a;免费的5T的OneDrive账户。 Google&#xff1a;G Sutie Drive无限容量 微软、苹果、AWS、都有针对学…

二叉树前序中序后序遍历(非递归)

大家好&#xff0c;又和大家见面啦&#xff01;今天我们一起去看一下二叉树的前序中序后序的遍历&#xff0c;相信这个对大家来说是信手拈来&#xff0c;但是&#xff0c;今天我们并不是使用常见的递归方式来解题&#xff0c;我们采用迭代方式解答。我们先看第一道前序遍历 1…

CCF编程能力等级认证GESP—C++6级—20231209

CCF编程能力等级认证GESP—C6级—20231209 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)闯关游戏工作沟通 答案及解析单选题判断题编程题1编程题2 单选题…

js中数字精度丢失问题详解(如何解决)

文章目录 一、场景复现二、浮点数三、问题分析小结 四、解决方案参考文献 一、场景复现 一个经典的面试题 0.1 0.2 0.3 // false为什么是false呢? 先看下面这个比喻 比如一个数 130.33333333...... 3会一直无限循环&#xff0c;数学可以表示&#xff0c;但是计算机要存…

mysql 2-17

UNION关键字和UNION ALL 自然连接 USING使用 函数 单行函数 基本函数 三角函数 指数和对数 进制间的转换 字符串函数 时间和日期函数 计算日期和时间的函数 日期的格式化和解析 流程控制函数

《剑指 Offer》专项突破版 - 面试题 47 : 二叉树剪枝(C++ 实现)

题目链接&#xff1a;LCR 047. 二叉树剪枝 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 一棵二叉树的所有节点的值要么是 0 要么是 1&#xff0c;请剪除该二叉树中所有节点的值全都是 0 的子树。例如&#xff0c;在剪除下图 (a) 中二叉树中所有节点值都为 0 的…

【NI-DAQmx入门】处理数据采集和测试系统中噪声的几种主要方法

在实际的测试系统中测量模拟信号并不总是像将信号源连接到测量设备那么简单。数据完整性取决于被控制和监视的电气设备发送和接收的干净的电信号。 电噪声可能会掩盖电信号并使其无法识别&#xff0c;从而损害原本具备功能的 DAQ 系统。数据采集​​是关键任务应用测试系统的一…

110 C++ decltype含义,decltype 主要用途

一&#xff0c;decltype 含义和举例 decltype有啥返回啥&#xff0c;auto则不一样&#xff0c;auto可能会舍弃一些东西。 decltype 是 C11提出的说明符。主要作用是&#xff1a;返回操作数的数据类型。 decltype 是用来推导类型&#xff0c;decltype对于一个给定的 变量名或…

C语言:螺旋阵

右螺旋阵 输入格式 一行&#xff0c;输入两个正整数n和m&#xff08;2≤n,m≤30&#xff09;&#xff0c;分别表示行和列数 输出格式 输出对应的右螺旋矩阵 一个4*4的右螺旋矩阵是下面这个样子的&#xff1a; 1 2 3 4 12 13 14 5 11 16 15 6 10 9 &#xff18; 7 void …

【深度优先】【广度优先】Leetcode 104 二叉树的最大深度 Leetcode 110 二叉树的最小深度

【深度优先】【广度优先】Leetcode 104 二叉树的最大深度 Leetcode 104 二叉树的最大深度解法1 深度优先 递归法 后序&#xff1a;左右中解法2 广度优先&#xff1a;层序遍历 Leetcode 110 二叉树的最小深度解法1 深度优先&#xff1a;递归 后序遍历 左右中解法2 广度优先&…

C++模板详解 —— 函数模板与类模板

C模板详解 泛型编程函数模板函数模板的概念函数模板的原理 函数模板的实例化函数模板的匹配原则类模板类模板的定义格式类模板的实例化 泛型编程 如果让你编写一个函数&#xff0c;用于两个数的交换。在C语言中&#xff0c;我们会用如下方法&#xff1a; void Swapi(int* p1,…