- 题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
- 思路
- 用一个队列记录连续正数序列的和,如果等于sum写入答案,如果大于将左边的数字移除队列
- 如果index的元素没有进去队列,需要for循环中i--
- 最后遍历完数组之后,还需要检查队列中连续序列的和是否为sum,如果等于sum写入答案
- 启发或者坑
- 队列的函数是:pop push front等
- 代码
class Solution { public: vector<vector<int> > FindContinuousSequence(int sum) { queue<int> values; int temp_sum = 0; vector<vector<int> > res; for (int i = 1; i < sum; i++) { if (temp_sum == sum) { vector<int> oneres; while (!values.empty()) { oneres.push_back(values.front()); values.pop(); } for (int i = 1; i < oneres.size(); i++) { values.push(oneres[i]); } temp_sum -= oneres[0]; res.push_back(oneres); //index的元素没有进去队列,那么就需要i-- i--; } else if (temp_sum < sum) { values.push(i); temp_sum += i; } else { temp_sum -=values.front(); values.pop(); //index的元素没有进去队列,那么就需要i-- i--; } } //每次都是还没有push进去的时候检查,所以for循环的最后 if (temp_sum == sum) { vector<int> oneres; while (!values.empty()) { oneres.push_back(values.front()); values.pop(); } res.push_back(oneres); } return res; } };
剑指offer 43.和为S的连续正数序列
猜你喜欢
转载自blog.csdn.net/Alexia23/article/details/103933945
今日推荐
周排行