剑指Offer——(42)和为S的连续正数序列
2017-07-26 20:57
344 查看
题目描述:
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck!
实现如下:
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck!
实现如下:
//初始little数值为1,big数值为2 //当count等于sum时,添加序列 //否则判断 //当count大于sum时,后移little,big不动,使count减小,过程中count等于sum时,添加序列,直到little等于big //当count小于sum时,后移big,使count增大 //直到little等于middle //注意判断sum的值是否合法 class Solution { public: vector<vector<int>> FindContinuousSequence(int sum) { vector<vector<int>> vec; if (sum < 3)//防御性动作 return vec; int little = 1;//左边界,即最小值 int big = 2;//右边界,即最大值 int middle = (sum + 1) / 2;//中间值 int count = little + big;//记录序列之和 while (little < middle) { if (count == sum)//当count等于sum使,添加序列 { vector<int> tmp; for (int i = little; i <= big; ++i) tmp.push_back(i); vec.push_back(tmp); } while (count > sum && little < middle)//此时count大于sum { count -= little;//减小count ++little;//后移最小值 if (count == sum)//count等于sum时,添加序列 { vector<int> tmp; for (int i = little; i <= big; ++i) tmp.push_back(i); vec.push_back(tmp); } } ++big;//此时,count小于sum,后移最大值,使count增大 count += big; } return vec; } };
相关文章推荐
- 剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串
- 【剑指offer-解题系列(42)】和为S的连续正数序列
- 剑指offer---和为s的两个数字VS和为s的连续正数序列
- 【剑指offer】Q41:和为s的连续正数序列
- 【剑指offer】面试题41-和为S的两个数VS和为S的连续正数序列
- 剑指Offer_面试题41_和为s的两个数字 VS 和为s的连续正数序列
- 剑指Offer学习总结-和为S的连续正数序列
- 剑指offer之面试题41和为s的两个数字VS和为s的连续正数序列
- 剑指Offer 41题 和为s的两个数字VS 何为S的连续正数序列 Java版
- 剑指offer---和为S的连续正数序列
- 剑指offer 41题【知识迁移能力】和为S的连续正数序列
- 剑指offer-面试题41-和为s的两个数字VS和为s的连续正数序列
- 【剑指offer】面试题57(2):和为S的连续正数序列
- 剑指Offer: 和为S的连续正数序列
- 剑指offer 42 和为S的连续正整数序列
- 剑指offer-和为S 的连续正数序列-Java
- 剑指Offer——输入正整数S,打印出所有和为S的连续正数序列(至少含有两个正数)
- 剑指offer 和为S的连续正数序列
- 剑指offer--和为S的连续正数序列
- 【剑指offer】和为定值的连续正数序列