其他分享
首页 > 其他分享> > 剑指 Offer 57 - II. 和为s的连续正数序列(滑动窗口)

剑指 Offer 57 - II. 和为s的连续正数序列(滑动窗口)

作者:互联网

剑指 Offer 57 - II. 和为s的连续正数序列

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

 

示例 1:

输入:target = 9
输出:[[2,3,4],[4,5]]

示例 2:

输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]

 

限制:

 

 1 class Solution {
 2 public:
 3     vector<vector<int>> findContinuousSequence(int target) {
 4         int left = 1;
 5         int right = 2;
 6         vector<vector<int>> ans;
 7         while (left < right) {
 8             /* 区间[left, right]元素之和为sum = Sum2 - Sum1 =  (right + left) * (right - left + 1) / 2
 9             *1~left - 1元素之和:Sum1 = (left - 1) * left / 2
10             *1~right元素之和:Sum2 = right * (right + 1) / 2
11             */
12             int sum = (right + left) * (right - left + 1) / 2;
13             if (sum == target) {
14                 vector<int> tmp;
15                 for (int i = left; i <= right; i++) {
16                     tmp.emplace_back(i);
17                 }
18                 ans.emplace_back(tmp);
19                 left++;
20             } else if (sum < target) { // 需扩大区间范围
21                 right++;
22             } else { // 需缩小区间范围
23                 left++;
24             }
25         }
26         return ans;
27     }
28 };

 

标签:right,target,Offer,int,57,II,序列,sum,left
来源: https://www.cnblogs.com/MGFangel/p/16322602.html