有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列,是他们的和等于sum,返回此子序列的长度,如果没有满足要求的序列,返回-1。
输入描述:
序列:1,2,3,4,2
宿命:6
输入序列由数字和英文逗号构成,数字之间采用英文逗号分隔;
示例1
输入:
1,2,3,4,2
6
输出:
3
示例2
输入:
1,2,3,4,2
20
输出:
-1
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 函数用于计算长度最长的连续子序列的长度
int longestSubsequence(vector<int>& nums, int sum) {
int n = nums.size(); // 序列的长度
int left = 0, right = 0; // 左右指针
int currSum = 0; // 当前子序列的和
int maxLength = 0; // 最长子序列的长度
while (right < n) {
currSum += nums[right]; // 将当前元素加入当前子序列的和
while (currSum > sum) {
currSum -= nums[left]; // 如果当前子序列的和大于sum,则从左边开始减去元素,调整子序列的和
left++; // 左指针右移一位
}
if (currSum == sum) {
maxLength = max(maxLength, right - left + 1); // 如果当前子序列的和等于sum,则计算当前子序列的长度,并更新最长长度
}
right++; // 右指针右移一位
}
return maxLength > 0 ? maxLength : -1; // 返回最长子序列的长度,如果没有满足条件的子序列,则返回-1
}
int main() {
string input; // 输入字符串
int sum; // 目标和
vector<int> nums; // 存储整数序列
// 获取输入字符串和目标和
getline(cin, input);
cin >> sum;
// 将输入字符串解析为数字序列
string numStr = "";
for (char c : input) {
if (isdigit(c)) {
numStr += c;
} else if (c == ',') { // 遇到逗号,则将当前数字加入序列,并清空临时字符串
nums.push_back(stoi(numStr));
numStr = "";
}
}
if (numStr != "") {
nums.push_back(stoi(numStr)); // 处理最后一个数字
}
int result = longestSubsequence(nums, sum); // 调用函数计算最长子序列的长度
cout << result << endl; // 输出结果
return 0;
}
解法2
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int func(vector<int> v, int sum) {
int length = v.size();
int maxLength = -1;
int currentSum = 0;
int start = 0;
for (int end = 0; end < length; end++) {
currentSum += v[end];
while (currentSum > sum) {
currentSum -= v[start];
start++;
}
if (currentSum == sum) {
int currentLength = end - start + 1;
maxLength = max(maxLength, currentLength);
}
}
return (maxLength == -1) ? -1 : maxLength;
}
int main() {
string input;
getline(cin, input);
int sum;
cin>>sum;
vector<int> v;
istringstream ss(input);
string token;
while (getline(ss, token, '\n')) {
v.push_back(stoi(token));
}
int result = func(v, sum);
cout << result << endl;
return 0;
}