剑指 Offer 57 - II. 和为s的连续正数序列
难度: e a s y \color{Green}{easy} easy
题目描述
输入一个正整数 t a r g e t target target ,输出所有和为 t a r g e t target target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
限制:
- 1 < = t a r g e t < = 1 0 5 1 <= target <= 10^5 1<=target<=105
算法
(双指针)
设连续正整数序列的左边界 left
和右边界 right
,则可构建滑动窗口从左向右滑动。循环中,每轮判断滑动窗口内元素和与目标值 target
的大小关系,若相等则记录结果,若大于 target
则移动左边界 left
(以减小窗口内的元素和),若小于 target
则移动右边界 right
(以增大窗口内的元素和)。
算法流程:
-
初始化: 左边界
left = 1
,右边界right = 2
,元素和sum = 3
,结果列表ans
,中间数middle = (target + 1) / 2
; -
循环: 当
left ≥ middle
时跳出;- 当
sum>target
时: 向右移动左边界left = left + 1
,并更新元素和sum
; - 当
sum<target
时: 向右移动右边界right = right+1
,并更新元素和sum
; - 当
sum=target
时: 记录连续整数序列,并向右移动左边界left = left+1
;
- 当
-
返回值: 返回结果列表
ans
;
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组的长度。需要遍历数组一次。
-
空间复杂度 : O ( 1 ) O(1) O(1)
C++ 代码
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int>> ans;
int left = 1, right = 2;
int middle = (target + 1) / 2;
int sum = left + right;
vector<int> res;
while (left < middle) {
if (sum == target) {
for (int i = left; i <= right; i ++)
res.push_back(i);
ans.push_back(res);
res.clear();
}
while (sum > target && left < middle) {
sum -= left;
left ++;
if (sum == target) {
for (int i = left; i <= right; i ++)
res.push_back(i);
ans.push_back(res);
res.clear();
}
}
// sum < target;
right ++;
sum += right;
}
return ans;
}
};
相关文章
- IJCAI2022《对抗序列决策》教程
- SIGIR'21 因果推断+推荐系统:利用反事实理论增强用户行为序列数据
- 使用R获取DNA的反向互补序列
- SAP UI5 Fiori 应用在启动时向 ABAP 后台发起的 OData 请求序列的顺序和作用分析
- ARIMA模型,ARIMAX模型预测冰淇淋消费时间序列数据|附代码数据
- R语言用GARCH模型波动率建模和预测、回测风险价值 (VaR)分析股市收益率时间序列|附代码数据
- Transformer新玩法登Nature子刊:DeepMind用新变体读取DNA长序列,瞄准遗传病高发区域
- 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质示例 | 证明 共轭对称序列 x_e(n) 的 傅里叶变换 是 原序列傅里叶变换 的实部 )
- 优化 Oracle 序列缓存的方法(oracle序列缓存)
- 掌握Oracle数据库中的序列字段(oracle序列字段)
- Oracle 数据库序列取值技术(oracle取序列)
- 使用zookeeper序列节点实现不可重入分布式锁
- 从SQL Server中掌控序列号:改善数列运算(sqlserver序列码)
- Oracle中自动增长序列保证主键安全(oracle主键自增序列)
- 编排Redis集群正确位序列技术(redis集群位序列)
- python基础教程之序列详解