D11 两数之和 II - 输入有序数组

LCR 006. 两数之和 II - 输入有序数组 - 力扣(LeetCode)

这道题目也是双指针的一个典型应用,题目要求找出和为target的两个数字的下标,并且告诉了有且仅有一对符合条件的数字。

而且题目已经给排好序了,这道题目其实可以暴力匹配嵌套for循环来解决,但是排序就没用了。。如果还记得盛水最多的容器这道题目的话,我们可以用相同的操作,两个指针分别为leftright,两边到中间扫描,如果两数相加大于target,那么显然需要减小右端的数值,也就是right--。反之,增大左端的数值,也就是left++,直到两端的和为target,这个问题就解决了。

class Solution {public int[] twoSum(int[] numbers, int target) {int l = 0;int r = numbers.length - 1;while(l < r){if(numbers[l] + numbers[r] > target){r--;}else if(numbers[l] + numbers[r] < target){l++;}else{return new int[]{l, r};}}return new int[]{};}
}

三数之和

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

这道题目跟上道题目很像,其实是延续了上道题目的做法,这道题目要求判断是否存在三元组,使得三者之和为0,并且要求不能重复。

有了上一道题的启发,我们不管三七二十一,先给他排序,有序总比无序容易处理。我们大体想一下,虽然这是求三个数的和,无非就是固定一个数num,其他两个数nums[l] nums[r],继续二数之和的操作。当找到一个解时,跳过与nums[l] nums[r]相同的值,避免产生重复三元组。

解题思路

  • 先排序,把数组变为非降序
  • 固定第一个数num = num[i],在他右侧用双指针(l,r)寻找符合num + nums[l] + nums[r] = 0的数值
  • 去重,找到解时,跳过与nums[l] nums[r]相同的值,避免产生重复三元组。
  • 优化,利用排序后“最小/最大可能和”的上下界,提前 break/continue,减少无效枚举。

这个题目的难点在于去重和剪枝优化,涉及到两次去重两次剪枝。

if(i > 0 && num == nums[i - 1]) continue;

● 去重1(对 i):如果当前 x 和上一个相同,那么以它为首的三元组会和上次完全重复,直接跳过。

if (x + nums[i + 1] + nums[i + 2] > 0) break; // 优化一

● 优化一(上界剪枝):数组有序时,固定 x 后,能得到的最小三数和是 x + nums[i+1] + nums[i+2](取右侧最小的两个数)。
● 若这个最小和已经大于 0,那么无论 j,k 取什么,都只会更大 ⇒ 后续 i 也不可能成功 ⇒ 可以直接 break 结束外层循环。

if (x + nums[n - 2] + nums[n - 1] < 0) continue; // 优化二

● 优化二(下界剪枝):固定 x 后,能得到的最大三数和是 x + nums[n-2] + nums[n-1](取右侧最大的两个数)。
● 若这个最大和仍然小于 0,说明以 x 为首无论怎么取都不够大,不可能凑到 0 ⇒ 换更大的首元素,continue。
两个优化都建立在“数组已排序”的前提上,能显著减少双指针的启动次数与无效移动。

class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> ans = new ArrayList<>();int n = nums.length;for (int i = 0; i < n - 2; i++) { //因为是三元组,所有只需要到n-3int num = nums[i];if(i > 0 && num == nums[i - 1]) continue; //去掉重复部分if(num + nums[i + 1] + nums[i + 2] > 0) break; //后边部分的和绝对都大于0,没有必要在循环下去if(num + nums[n - 1] + nums[n - 2] < 0) continue; //说明当前数字与最大的两个值的和仍小于0,直接跳到下一个数字int l = i + 1; // 二数之和的左右边界int r = n - 1;while(l < r){if(num + nums[l] + nums[r] > 0){r--;}else if(num + nums[l] + nums[r] < 0){l++;}else{ans.add(List.of(num, nums[l], nums[r]));for(l++; l < r && nums[l] == nums[l - 1]; l++);//过滤掉与当前解涉及元素相同的部分for(r--; r > l && nums[r] == nums[r + 1]; r--);}}}return ans;}
}

其实代码还可以优化,

if(num + nums[i + 1] + nums[i + 2] > 0) break; 
if(num + nums[n - 1] + nums[n - 2] < 0) continue; 

如果当前连续三个值之和大于0,那就不用往后看了,后面的一定大于0。

如果当前值与最大两值之和小于0,也不用看了,说明num = nums[i],至少这个值不符合题意,但是i++,后面的元素可能会有满足题意的。

如果这篇文章对你有所帮助,请点赞、评论、收藏,创作不易,你的支持是我创作的动力。

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

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

相关文章

在一台没联网的机器上,用ollama加载qwen3,14b

文章目录 背景 去另一台机器下载模型 使用docker部署ollama 后续 背景 项目甲方终于搞定了一台T4,咱们的项目又可以正常推进了。 但是,高高兴兴地上去之后,发现,此机器竟不可以联网~ 不过好在,前辈已经把docker装好了。 竟然还有ollama的镜像。 可以的,至少可以节省一…

Angular由一个bug说起之十八:伴随框架升级而升级ESLint遇到的问题与思考

伴随框架升级而升级ESLint遇到的问题与思考 对于eslint这个前端事实上的代码检查工具标准&#xff0c;大家可能是再熟悉不过了。几乎是在编码的时时刻刻都在和它接触。在我们开发维护长达十年的项目中自然也是采用了ESLint&#xff0c;在从 AngularJS 一路到今天现代化的 Angu…

unfold 切图像,图形transformer的切割操作

import torch x torch.arange(8*12).view(1,1,8,12) mx.unfold(2, 4, 4) n m.unfold(3, 4, 4)输入第一次切&#xff0c;切高度维度&#xff0c;但是切完做了转置 &#xff0c;得到&#xff08;1&#xff0c;1&#xff0c;2&#xff0c;12&#xff0c;4&#xff09;切宽度 得…

基于最小二乘支持向量机的数据回归预测 LSSVM

一、作品详细简介 1.1附件文件夹程序代码截图 全部完整源代码&#xff0c;请在个人首页置顶文章查看&#xff1a; 学行库小秘_CSDN博客​编辑https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夹说明 1.2.1 main.m主函数文件 该MATLAB 代码实现了…

Java虚拟机故障处理工具全指南

目录 一、JVM故障处理工具概述 二、详细工具解析 1. jps&#xff1a;虚拟机进程状况工具 2. jstat&#xff1a;虚拟机统计信息监视工具 3. jinfo&#xff1a;Java配置信息工具 4. jmap&#xff1a;Java内存映像工具 5. jhat&#xff1a;堆转储快照分析工具 6. jstack&a…

【LeetCode热题100道笔记+动画】接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水…

短剧小程序系统开发:构建影视娱乐新生态的基石

在移动互联网的浪潮中&#xff0c;影视娱乐行业正经历着深刻的变革。短剧&#xff0c;作为一种新兴的内容形式&#xff0c;以其独特的魅力和广泛的受众基础&#xff0c;成为了行业发展的新亮点。而短剧小程序系统开发&#xff0c;则是构建影视娱乐新生态的基石&#xff0c;为行…

基于Pytochvideo训练自己的的视频分类模型

视频分类模型简介 ​X3D 系列模型 官方网站 https://github.com/facebookresearch/SlowFast ​提出论文​ Facebook Research 的《X3D: Expanding Architectures for Efficient Video Recognition》 https://arxiv.org/pdf/2004.04730 原理 X3D 的设计思路受到机器学习中…

LidaRefer-v2论文速读

研究背景 研究背景 3D视觉定位&#xff08;3D Visual Grounding, VG&#xff09;是一项旨在根据自然语言描述&#xff0c;在三维场景中精确定位出相应物体或区域的任务 。这项技术在人机交互领域至关重要&#xff0c;尤其是在自动驾驶、机器人技术和AR/VR等应用中&#xff0c;它…

逻辑移位与算术移位

根本的区别在于&#xff1a;它们如何对待符号位&#xff08;最高位&#xff09;。 一、逻辑移位 (Logical Shift) 无论左移、右移&#xff0c;空出的位永远用 0 填充。主要针对无符号整数、快速乘除2的幂。 二、算术移位 (Arithmetic Shift) 左移用 0 填充、右移用符号位填充。…

内存对齐的使用和禁用

在 C 语言和 C 中&#xff0c;__attribute__((packed)) 是一种用于数据结构体的编译器扩展属性&#xff0c;这个属性主要用于修改结构体的内存对齐行为。背景知识&#xff1a;结构体内存对齐在许多计算机架构中&#xff0c;编译器会自动对数据进行对齐&#xff08;alignment&am…

SpringBoot3后端项目介绍:mybig-event

mybig-event 项目简介 mybig-event 是一个基于 Spring Boot 的事件管理系统&#xff0c;提供用户管理、文章发布、分类管理、文件上传等功能&#xff0c;采用现代化的 Java 技术栈构建&#xff0c;支持高效开发和部署。 仓库链接&#xff1a;https://github.com/foorgange/mybi…

week3-[分支嵌套]方阵

week3-[分支嵌套]方阵 题目描述 有 nmn\times mnm 个人站成 nnn 行 mmm 列的方阵。我们想知道第 xxx 行 yyy 列的人的某个方向有没有人。 输入格式 输入共 222 行。 第 111 行输入 444 个正整数 n,m,x,yn,m,x,yn,m,x,y。 第 222 行输入 111 个字符为 U、D、L、R 其中之一&#…

深入理解C++ std::shared_ptr:现代C++内存管理的艺术与实践

在C++的发展历程中,内存管理始终是开发者面临的核心挑战。从C语言继承而来的手动内存管理方式,虽然提供了极大的灵活性,却也成为无数程序错误的根源。内存泄漏、悬空指针、双重释放等问题长期困扰着C++开发者,直到智能指针的出现改变了这一局面。作为C++11标准引入的重要特…

一个 WPF 文档和工具窗口布局容器

一个 WPF 文档和工具窗口布局容器、用于排列文档 和工具窗口的方式与许多知名 IDE 类似&#xff0c;例如 Eclipse、Visual Studio、 PhotoShop 等等 AvalonDock 是一个 WPF 文档和工具窗口布局容器&#xff0c;用于排列文档 和工具窗口的方式与许多知名 IDE 类似&#xff0c;例…

【qml-5】qml与c++交互(类型单例)

背景&#xff1a; 【qml-1】qml与c交互第一次尝试&#xff08;实例注入&#xff09; 【qml-2】尝试一个有模式的qml弹窗 【qml-3】qml与c交互第二次尝试&#xff08;类型注册&#xff09; 【qml-4】qml与c交互&#xff08;类型多例&#xff09; 【qml-5】qml与c交互&#…

循环神经网络(RNN)、LSTM 与 GRU (一)

循环神经网络&#xff08;RNN&#xff09;、LSTM 与 GRU &#xff08;一&#xff09; 文章目录循环神经网络&#xff08;RNN&#xff09;、LSTM 与 GRU &#xff08;一&#xff09;循环神经网络&#xff08;RNN&#xff09;、LSTM 与 GRU一、RNN&#xff08;Recurrent Neural N…

【AAOS】Android Automotive 16模拟器源码下载及编译

源码下载repo init -u https://android.googlesource.com/platform/manifest -b android-16.0.0_r2 repo sync -c --no-tags --no-clone-bundle源码编译source build/envsetup.sh lunch sdk_car_x86_64-bp2a-eng make -j8运行效果emualtorHomeAll appsSettingsHAVCNotification…

jvm三色标记

好的&#xff0c;咱们把专业概念和生活例子结合起来&#xff0c;一步一步说清楚三色标记法&#xff1a;一、核心概念&#xff1a;用“颜色”给对象贴“状态标签”就像给家里的物品贴标签&#xff0c;每种颜色代表它在“垃圾回收&#xff08;大扫除&#xff09;”中的状态&#…

生成式AI的能力边界与职业重构:从“百科实习生“到人机协作增强器

根据微软最新研究&#xff0c;基于20万条Copilot使用数据及用户反馈&#xff0c;研究者揭示了生成式AI在实际应用中的能力边界与职业影响。数据显示&#xff0c;用户使用AI助手最频繁的任务是信息获取&#xff08;占比近40%&#xff09;&#xff0c;其次是公众沟通类工作&#…