剑指 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 <= target <= 10^5
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