剑指Offer打卡day—— ACWing 76. 和为S的连续正数序列
Posted Johnny*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer打卡day—— ACWing 76. 和为S的连续正数序列相关的知识,希望对你有一定的参考价值。
【题目描述】
【思路】
前缀和数组统计区间和
至少含有两个数 [a,b] a + b <=n 且要求a、b连续 b <= n / 2 + 1
那么枚举区间起点a和终点b
class Solution {
long s[] = new long[100010];
public List<List<Integer> > findContinuousSequence(int sum) {
int t = (sum >> 1 )+ 1; // 右移运算符比+优先级还弱 所以要加括号
for(int i = 1; i <= t ; i ++)
s[i] = s[i - 1] + i;
List<List<Integer> > ans = new ArrayList<>();
for(int b = 1; b <= t; b ++){
for(int a = 1; a < b; a ++){
long res = s[b] - s[ a - 1];
if(res == sum){
List<Integer> sub = new ArrayList<>();
for(int i = a; i <= b; i ++) sub.add(i);
ans.add(sub);
}
}
}
return ans;
}
}
【思路】
双指针 等差数列前n项和公式
class Solution {
public List<List<Integer> > findContinuousSequence(int sum) {
int t = (sum >> 1) + 1;
List<List<Integer> > ans = new ArrayList<>();
for(int i = 2, j = 1; i <= t;){
int res = (i + j) * (i - j + 1) /2;
if( res == sum ){
List<Integer> sub = new ArrayList<>();
int k = j;
while( k <= i) {
sub.add(k);
k ++;
}
ans.add(sub);
//相等则 i、j同时右移
i ++;
j ++;
}
//如果当前区间和较小则i右移
else if( res < sum) i ++;
else j ++;
}
return ans;
}
}
以上是关于剑指Offer打卡day—— ACWing 76. 和为S的连续正数序列的主要内容,如果未能解决你的问题,请参考以下文章
剑指Offer打卡day42—— Acwing 62. 丑数
剑指Offer打卡day42——AcWing 77. 翻转单词顺序
剑指Offer打卡day42—— ACWing 81. 扑克牌的顺子
剑指Offer打卡day43—— Acwing 86. 构建乘积数组