和为指定值的连续序列
2013-09-01 00:09
85 查看
输入一个整数s,打印出所有和为s的连续正整数序列(至少包含两个数)。例如,对于输入15,由于有1+2+3+4+5=15,4+5+6=15,7+8=15,所以打印出1~5、4~6、7~8三个序列。
有个比较好的做法是利用等差数列求和公式:s=a*n+n*(n-1)/2。这里的a是第一个元素,n是项数。
这种方法只适用于这个特定的应用场景,题目稍微改变一下就不太好处理了。例如,要求求得的序列是某个数值中的连续序列,不再是自然数连续序列,这样就没办法用这个方法了。这种情况下可以先将数组排序,然后按照下面的方法求解即可。
有个比较好的做法是利用等差数列求和公式:s=a*n+n*(n-1)/2。这里的a是第一个元素,n是项数。
int solve(int k) { int count = 0; for (int i = 1, v = 0; (v = i * (i - 1) / 2) <= k; i++) { if ((k - v) % i == 0) { // a = (k - v) / i; count++; } } return count; }
这种方法只适用于这个特定的应用场景,题目稍微改变一下就不太好处理了。例如,要求求得的序列是某个数值中的连续序列,不再是自然数连续序列,这样就没办法用这个方法了。这种情况下可以先将数组排序,然后按照下面的方法求解即可。
int solve(int A[], int N, int val) { int count = 0, beg = 1, end = 0, sum = A[0]; while (beg < end && end < N) { if (sum == val) { count++; // A[beg] -> A[end] sum += A[++end]; } else if (sum < val) { sum += A[++end]; } else { sum -= A[beg++]; } } return count; }
相关文章推荐
- 面试题40:输出和为指定值的连续正数序列
- 连续的正数序列,使得和为指定值
- 和为指定值的连续序列
- 和为S的连续正数序列
- 求两个字符串的最长的连续公共子串和求两个字符串的公共子序列
- R,生成连续序列,生成重复序列,seq,rep
- 求最长连续递增子序列长度
- 输入一个正数n,输出所有和为n连续正数序列。
- LeetCode(Longest Consecutive Sequence ) 最长连续序列
- 40. 网易面试题:和为n连续正数序列(数组)
- 笔试面试算法经典--最长连续序列
- 和为S的连续正数序列
- LintCode124-最长连续序列
- 和为s的两个数字VS和为s的连续正数序列
- 和为n的连续正数序列
- 和为S的连续正数序列
- 剑指offer:和为S的连续正数序列
- 最长上升连续子序列 II
- 和为S的连续正数序列
- 和为S的连续正数序列