力扣.167 两数之和 II two-sum-ii
数组系列
力扣数据结构之数组-00-概览
力扣.53 最大子数组和 maximum-subarray
力扣.128 最长连续序列 longest-consecutive-sequence
力扣.1 两数之和 N 种解法 two-sum
力扣.167 两数之和 II two-sum-ii
力扣.170 两数之和 III two-sum-iii
力扣.653 两数之和 IV two-sum-IV
力扣.015 三数之和 three-sum
力扣.016 最接近的三数之和 three-sum-closest
力扣.259 较小的三数之和 three-sum-smaller
题目
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列,请你从数组中找出满足相加之和等于目标数 target 的两个数。
如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
示例 1:
输入:numbers = [2,7,11,15], target = 9 输出:[1,2] 解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
示例 2:
输入:numbers = [2,3,4], target = 6 输出:[1,3] 解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
示例 3:
输入:numbers = [-1,0], target = -1 输出:[1,2] 解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
提示:
2 <= numbers.length <= 3 * 10^4
-1000 <= numbers[i] <= 1000
numbers 按 非递减顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案
前言
这道题和 leetcode 的第一道题非常类似,看起来非常简单。
不过今天回头看,解法还是很多的。
大概可以有下面几种:
暴力解法
数组排序+二分
HashSet/HashMap 优化
v1-暴力解法
思路
直接两次循环,找到符合结果的数据返回。
这种最容易想到,一般工作中也是我们用到最多的。
实现
注意:这里的下标从1开始。一看就不是一个面向程序员的题目。
class Solution {public int[] twoSum(int[] nums, int target) {int[] res = new int[2];final int n = nums.length;for(int i = 0; i < n; i++) {for(int j = i+1; j < n; j++) {if(nums[i] + nums[j] == target) {res[0] = i+1;res[1] = j+1;}}}return res;}
}
效果
超出时间限制 21 / 24 个通过的测试用例
小结
暴力算法虽然容易想到,不过如果遇到特别长的场景用例,会直接超时。
我们如何改进一下呢?
排序是这个场景另一种很有用的方式。
v2-排序+二分
思路
我们希望排序,然后通过二分法来提升性能。
这里就发现,题目已经帮我排序好了。所以第一题的麻烦的部分全部省略了。
代码
class Solution {public int[] twoSum(int[] nums, int target) {final int n = nums.length;for(int i = 0; i < n; i++) {int other = target - nums[i];int j = binarySearch(nums, other, i+1);if(j >= 0) {return new int[]{i+1, j+1};}}return new int[]{-1, -1};}private int binarySearch(int[] nums,int target,int startIx) {int left = startIx;int right = nums.length-1;while (left <= right) {int mid = left + (right - left) / 2;int val = nums[mid];if(val == target) {return mid;}if(val > target) {right = mid-1;} else {left = mid+1;}}return -1;}
}
效果
4ms 16.87%
嗯?
这个竟然不是本题目的最佳解法吗?
v3-HashMap
思路
在我们写完上面的写法之后,有没有一种感觉?
既然是要找另一部分的值,那么直接 Hash,复杂度 O(1) 不是更快?
是的,你真是个小机灵鬼。
哈希在这种等于的场景是最快的,不过上面的二分适用性更广一些,比如查询大于或者小于的时候。
当然本体限制了,必须常量的空间,所以这种解法被限制了,不过也值得看一下。
我们先来看一下哈希的解法。
代码
注意:这里的顺序要求有序,所以返回的时候和 T1 要反过来。
class Solution {public int[] twoSum(int[] nums, int target) {int n = nums.length;HashMap<Integer, Integer> hashMap = new HashMap<>();for(int i = 0; i < n; i++) {int other = target - nums[i];if(hashMap.containsKey(other)) {int j = hashMap.get(other);return new int[]{j+1, i+1};}// 存储hashMap.put(nums[i], i);}return new int[]{-1, -1};}
}
效果
7ms 6.01%
只能说性能很差,猜测是 map 构建导致的耗时,不然这个作为 O(n) 的解法一定性能更好才对。
说明这一题一定有更加适合的解法。
v4-双指针
思路
其实在 v2 二分法的排序思路上,我们可以受到一些启发。
排序+二分是我们非常老实的一次遍历,然后再二分查找,复杂度为 n*log(n)
那么有没有可能在有序的数组中不用这么麻烦?
那就要说到巧妙的双指针了。
双指针
我们定义两个指针
left=0
right=n-1
sum=num[left]+num[right-1]
因为数组有有序的,所以只有 3 种情况:
sum == target 直接满足
sum < target,left++
sum > target, right--
代码
class Solution {public int[] twoSum(int[] nums, int target) {int n = nums.length;int left = 0;int right = n-1;while (left < right) {int sum = nums[left] + nums[right];if(sum == target) {return new int[]{left+1, right+1};}if(sum < target) {left++;}if(sum > target) {right--;}}return new int[]{-1, -1};}
}
效果
1ms
99.36%
小结
这类题目的思路基本都是类似的。
我们有常见的几种解法:
1) 暴力
2)借助 Hash
3) 排序+二分
4)双指针==》针对有序数组
我们后续将看一下 n 数之和的系列,感兴趣的小伙伴点点赞,关注不迷路。
相关文章:
力扣.167 两数之和 II two-sum-ii
数组系列 力扣数据结构之数组-00-概览 力扣.53 最大子数组和 maximum-subarray 力扣.128 最长连续序列 longest-consecutive-sequence 力扣.1 两数之和 N 种解法 two-sum 力扣.167 两数之和 II two-sum-ii 力扣.170 两数之和 III two-sum-iii 力扣.653 两数之和 IV two-…...
ipconfig
本文内容来自智谱清言的回答。 ------ 以太网适配器 以太网: 媒体状态 . . . . . . . . . . . . : 媒体已断开连接 连接特定的 DNS 后缀 . . . . . . . : 以太网适配器 以太网: 这部分表示正在显示名为“以太网”的网络适配器的信息。在 Windows 中,默认的以太…...
Qt_day3_信号槽
目录 信号槽 1. 概念 2. 函数原型 3. 连接方式 3.1 自带信号 → 自带槽 3.2 自带信号 → 自定义槽 3.3 自定义信号 4. 信号槽传参 5. 对应关系 5.1 一对多 5.2 多对一 信号槽 1. 概念 之前的程序界面只能看,不能交互,信号槽可以让界面进行人机…...
求从2开始的第n个素数
方法一:暴力法 思路:从2开始,逐个判断每个数是否为素数。素数是除了1和它自身外,不能被其他自然数整除的数。对于每个数m,从2到sqrt(m)遍历,如果能被整除则不是素数。当找到n个素数时停止。 C 代码如下&am…...
【Android】View—基础知识,滑动,弹性滑动
基础知识 什么是View 在 Android 中,View 是用户界面(UI)中的基本组件,用于绘制图形和处理用户交互。所有的 UI 组件(如按钮、文本框、图片等)都是 View 的子类。可以说,View 是构建 Android …...
MYSQL中的两种转义操作
在 MySQL 中,转义字符用于处理特殊字符,以防止语法错误或 SQL 注入攻击,而单双引号都是需要重点注意的字符 可以用转义符\ 和 两个连续的引号 来起到转义引号的作用 转义符转义: 这是users表中的数据 如果查询admin 或者 admin" 用户,可以用转义符\ 两个连…...
力扣题目解析--删除链表的倒数第n个节点
题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&…...
Knowledge Graph-Enhanced Large Language Models via Path Selection
研究背景 研究问题:这篇文章要解决的问题是大型语言模型(LLMs)在生成输出时存在的事实不准确性,即所谓的幻觉问题。尽管LLMs在各种实际应用中表现出色,但当遇到超出训练语料库范围的新知识时,它们通常会生…...
Android 项目模型配置管理
Android 项目配置管理 项目模型相关的配置管理config.gradle文件:build.gradle文件: 参考地址 项目模型相关的配置管理 以下是一个完整的build.gradle和config.gradle示例: config.gradle文件: ext {// 模型相关配置࿰…...
「QT」几何数据类 之 QSizeF 浮点型尺寸类
✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...
Essential Cell Biology--Fifth Edition--Chapter one(2)
1.1.1.3 Living Cells Are Self-Replicating Collections of Catalysts 催化剂集合 生物最常被引用的特性之一是它们的繁殖能力。对于细胞来说,这个过程包括复制它们的遗传物质和其他成分,然后分裂成两个,产生一对子细胞[daughter cells]&a…...
大语言模型LLMs在医学领域的最新进展总结
我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 相比其他学科,医学AI,是发表学术成果最多的领域。 医学数据的多样性和复杂性(包括文本、图像、基因组数据等),使得…...
云防护单节点2T抗攻击能力意味着什么?
随着互联网的发展,DDoS攻击的规模和频率不断增加,对企业和个人用户的网络服务造成了严重威胁。云防护服务作为一种高效的DDoS防护手段,逐渐成为许多企业的首选。本文将重点讨论云防护单节点2T(太比特每秒)抗攻击能力的…...
IDEA在编译时: java: 找不到符号符号: 变量 log
一、问题 IDEA在编译的时候报Error:(30, 17) java: 找不到符号符号: 变量 log Error:(30, 17) java: 找不到符号 符号: 变量 log 位置: 类 com.mokerson.rabbitmq.config.RabbitMqConfig 二、解决方案 背景:下载其他同事代码时,第一次运行,…...
HTML 基础架构:理解网页的骨架
HTML的文档结构主要由以下几个部分组成:<html>、<head>和<body>。 <html>标签是HTML文档的根元素,用来包裹整个HTML文档的内容。<head>标签用于定义文档的头部,包含了一些元数据和其他不直接显示在页面上的内…...
FPGA学习笔记#5 Vitis HLS For循环的优化(1)
本笔记使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,主要根据教程:跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 从这一篇开始正式进入HLS对C代码的优化笔记 目录 1.循环优化中的基…...
web实操4——servlet体系结构
servlet体系结构 我们基本都只实现service方法,其余几个都不用, 之前我们直接实现servlet接口,所有的方法都必须实现,不用也得写,不然报错,写了又不用当摆设。 能不能只要定义一个service方法就可以&…...
Linux开发讲课48--- Linux 文件系统概览
本文旨在高屋建瓴地来讨论 Linux 文件系统概念,而不是对某种特定的文件系统,比如 EXT4 是如何工作的进行具体的描述。另外,本文也不是一个文件系统命令的教程。 每台通用计算机都需要将各种数据存储在硬盘驱动器(HDD)…...
Node.js 模块详解
模块的概念 Node.js 运行在 V8 JavaScript 引擎上,通过 require() 函数导入相关模块来处理服务器端的各种进程。一个 Node.js 模块可以是一个函数库、类集合或其他可重用的代码,通常存储在一个或多个 .js 文件中。 例如,启动一个 Node.js 服…...
大厂面试真题-说说tomcat的优缺点
Tomcat作为服务器,特别是作为Java Web服务器,具有一系列优点和缺点。以下是对其优缺点的详细分析: 优点 开源免费: Tomcat是一个免费、开源的Web服务器,用户可以在任何环境下自由使用,无需支付任何费用。…...
Linux系统编译boot后发现编译时间与Windows系统不一致的解决方案
现象 如下图,从filezilla软件看虚拟机Linux中编译的uboot.img修改时间与Windows系统时间不同 解决过程 在Linux中查看编译的uboot详细信息,从而得到编译时间。终端输入ls -l后,如下图: 结论 说明在Linux是按照Windows系统时…...
WPS Office手机去广高级版
工具介绍功能特点 WPS Office是使用人数最多的移动办公软件,独有手机阅读模式,字体清晰翻页流畅;完美支持文字,表格,演示,PDF等51种文档格式;新版本具有海量精美模版及高级功能 安装环境 [名称…...
Python爬虫基础-正则表达式!
前言 正则表达式是对字符串的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则的字符串”,此字符串用来表示对字符串的一种“过滤”逻辑。正在在很多开发语言中都存在,而非python独有。对其知识点…...
Python处理PDF组件使用及注意事项
在 Python 中处理 PDF 文件时, 使用的组件及注意事项如下: 1. PyPDF2 / PyPDF4 说明: PyPDF2 和 PyPDF4 都是功能强大的 PDF 操作库,适用于合并、拆分、旋转 PDF 文件,提取 PDF 元数据等。PyPDF4 是 PyPDF2 的一个分…...
langgraph_plan_and_execute
整体入门demo 教程概览 欢迎来到LangGraph教程! 这些笔记本通过构建各种语言代理和应用程序,介绍了如何使用LangGraph。 快速入门(Quick Start) 快速入门部分通过一个全面的入门教程,帮助您从零开始构建一个代理&a…...
[代码随想录打卡Day8] 344.反转字符串 541. 反转字符串II 54. 替换数字
反转字符串 难度:易。 问题描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 这个就是开头…...
DCN DCWS-6028神州数码 AC 设备配置笔记
DCN DCWS-6028神州数码 AC 设备配置笔记 一、前期准备 PC 电脑网络配置 目的:使 PC 能够访问 AC 的 web 管理控制台。配置详情:web 管理控制台地址为 192.168.1.10,将 PC 电脑 IP 地址配置在 192.168.1.1 - 192.168.1.254 网段内,如 192.168.1.110,子网掩码 255.255.255.…...
Go语言的常用内置函数
文章目录 一、Strings包字符串处理包定义Strings包的基本用法Strconv包中常用函数 二、Time包三、Math包math包概述使用math包 四、随机数包(rand) 一、Strings包 字符串处理包定义 Strings包简介: 一般编程语言包含的字符串处理库功能区别…...
华为OD技术一面手撕题
150. 逆波兰表达式求值 来自leecode 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 、-、* 和 / 。每个操作数(运算对象)都…...
Qt低版本多网卡组播bug
原文地址 最近在某个项目中,发现了一个低版本Qt的bug,导致组播无法正常使用,经过一番排查,终于找到了原因,特此记录。 环境 Qt:5.7.0 mingw32操作系统:windows 11 现象 在Qt5.7.0版本中&…...
创业平台app有哪些/百度seo指数查询
增: append() #添加到原有列表的最后 In [1]: names ["老王","老李","老刘","老张"]In [2]: names.append("老赵")In [3]: names Out[3]: [老王, 老李, 老刘, 老张, 老赵] In [6]: names ["老王"…...
免费行情软件app网站大全下载苹果/2345网址导航设为主页
安装CentOS前,你必须要有CentOS的镜像: 点击前往阿里云下载或 点击前往官网下载 OK!下载好之后打开你的VMware或者其他支持Linux的软件,OK~接下来就是安装过程了! 1. 首先点击新建虚拟机 2. 选择典型的配置类型 3. 选…...
让wordpress图片和头像延迟加载/品牌营销策略
以下是函数代码:/*** 修改一个图片 让其翻转指定度数** param string $filename 文件名(包括文件路径)* param float $degrees 旋转度数* return boolean* author zhaocj*/function flip($filename,$src,$degrees 90){//读取图片$data getimagesize($filename);if…...
做网站的资料/青岛网站建设运营推广
目录 文章目录目录概述准备测试文件方法实例演练方法1: 通过重定向到null来清空文件内容方法2: 使用冒号":" 或 "true"命令重定向来清空文件方法3: 使用"echo -n "命令清空文件内容方法4: 使用truncate命令来清空文件内容方法5: 使用cat命令和/d…...
视频网站建设的意义论文/网站和网页的区别
进入 conda base 环境 conda activate base 或bash 退出 conda base 环境 conda deactivate...
定制营销产生的原因/湖南seo优化价格
现象:诺顿更新到5月17日的病毒库以后,会造成重起机器后无法进入系统,安全模式也无法进入,产生系统蓝屏现象。解决办法:暂时停用诺顿,等待新的升级病毒库。恢复办法:将C:\windows\system32\netap…...