返回最长子序列长度

有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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值