剑指 Offer 57. 和为s的两个数字
难度: e a s y \color{Green}{easy} easy
题目描述
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
限制:
- 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
- 1 < = n u m s [ i ] < = 1 0 6 1 <= nums[i] <= 10^6 1<=nums[i]<=106
算法
(双指针)
-
初始化: 双指针
i
j
分别指向数组nums
的左右两端 (俗称对撞双指针)。 -
循环搜索: 当双指针相遇时跳出;
- 计算和
s=nums[i]+nums[j]
; s > target
,则指针j
向左移动,即执行j=j−1
;s<target
,则指针i
向右移动,即执行i = i + 1
s=target
,立即返回数组[nums[i],nums[j]]
;
- 计算和
-
返回空数组,代表无和为
target
的数字组合。
最大的加最小的都比 target
大,所以最大的数舍弃;最小的加最大的都比 target
小,所以最小的舍弃。
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组的长度。需要遍历数组一次。
-
空间复杂度 : O ( 1 ) O(1) O(1)
C++ 代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int l = 0, r = nums.size() - 1;
while (l < r) {
if (nums[l] + nums[r] > target) {
r --;
continue;
}
if (nums[l] + nums[r] < target) {
l ++;
continue;
}
if (nums[l] + nums[r] == target) return {nums[l], nums[r]};
}
return {0, 0};
}
};
相关文章
- 2022全球数字经济大会丨腾讯携数字新技术“数”说未来
- 2022文博数字化报告丨数字技术如何让文物“活”起来、“潮”起来
- 【说站】python猜数字1到10
- 每日算法刷题Day16-和为S的两个数字、数字排列、二进制中1的个数
- c++int转换成char_字符数字转为int型
- 新时代数字政府建设与发展若干思考
- 美国数字美元试验的最新进展
- 箱讯ANYCASE智慧物流3.0焕新上线!打造“数字金融”全新国际物流模式
- 数字现代化与应用现代化
- 【数字信号处理】线性常系数差分方程 ( 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 “ 线性时不变系统 “ 案例二 | 修改边界条件 | 使用递推方法证明 )
- 【数字信号处理】相关函数与线性卷积关系 ( 卷积概念 | 相关函数概念 | 相关函数与线性卷积对比 | x(-m) 共轭 与 y(m) 的卷积就是两个信号 位移 m 的相关函数 )
- 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质示例 | 证明 共轭对称序列 x_e(n) 的 傅里叶变换 是 原序列傅里叶变换 的实部 )
- 2023-04-10:给定两个正整数x、y,都是int整型(java里) 返回0 ~ x以内,每位数字加起来是y的数字个数。 比如,x = 20、y = 5,返
- JavaScript生成随机字符串(数字+字母),长度自定义详解编程语言
- 算法-和为S的两个数字详解编程语言
- 农行推出ATM机数字人民币存取现功能 引导市民适应现金数字化
- MSSQL中操作获取随机数字的技巧(mssql 随机数字)
- Oracle计算法几个数字相加的神奇(oracle几个数字相加)
- Oracle实现两个数字相加的奇妙之旅(oracle两个数据相加)
- Oracle实现两个数字相减(oracle两个数字相减)
- 央行会通过手机号查用户隐私?数字人民币不够安全?穆长春一一回应
- 金融科技是油门,监管科技做刹车,云计算是一切底盘|“互联网+”数字经济峰会
- C#实现在两个数字之间生成随机数的方法