首页 > 其他分享 >最长子序列

最长子序列

时间:2024-05-08 15:11:24浏览次数:19  
标签:end max sum 长子 current start 序列

为了解决这个问题,我们可以使用滑动窗口的方法。滑动窗口可以让我们在不需要嵌套循环的情况下遍历序列中所有的连续子序列。

以下是这个方法的步骤:

  1. 初始化两个指针 startend,都指向序列的开始。
  2. 初始化当前和 current_sum 为 0。
  3. 移动 end 指针,每次移动都将 end 指向的值加到 current_sum
  4. 如果 current_sum 大于 sum,移动 start 指针,每次移动都从 current_sum 中减去 start 指向的值,直到 current_sum 小于或等于 sum
  5. 如果在任何时刻 current_sum 等于 sum,更新最长子序列的长度。
  6. 如果 end 到达序列的末尾,结束循环。
  7. 返回最长子序列的长度,如果没有找到,则返回 -1。

让我们把这个逻辑转换成 Python 代码:

def max_subsequence_length(sequence, target_sum):
    start = end = current_sum = 0
    max_length = -1

    while end < len(sequence):
        current_sum += sequence[end]

        while current_sum > target_sum and start < end:
            current_sum -= sequence[start]
            start += 1

        if current_sum == target_sum:
            max_length = max(max_length, end - start + 1)

        end += 1

    return max_length

# 示例
sequence = [1, 2, 3, 4, 2]
sum_to_find = 6
print(max_subsequence_length(sequence, sum_to_find))  # 输出: 3

sequence = [1, 2, 3, 4, 2]
sum_to_find = 20
print(max_subsequence_length(sequence, sum_to_find))  # 输出: -1

在这个代码中,我们通过不断地调整 startend 指针的位置来找到所有可能的连续子序列,并检查它们的和是否等于 sum。如果找到了和为 sum 的子序列,我们就更新最长子序列的长度。如果到最后都没有找到,就返回 -1。
'''有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列a,使他们的和等于sum,返回此子序列的长度,如果没有满足要求的序列,返回-1。

输入描述:
序列:1,2,3,4,2 sum: 6

输出描述:
序列长度:3

补充说明:
输入序列仅由数字和英文逗号构成,数字之间采用英文逗号分隔;序列长度:1<=N<=200;

输入序列不考虑异常情况,由题目保证输入序列满足要求。

示例1输入:
输入描述:
序列:1,2,3,4,2
sum: 6
输出:3
说明:
解释: 1,2,3和4,2两个序列均能满足要求,所以最长的连续序列为1,2,3,因此结果为3

示例2输入:
序列: 1,2,3,4,2
sum: 20
输出: -1

自己实现
def max_subsequence(lists, sum):
    slow = fast = cur_sum = 0
    current_max_subseq = -1

    while fast < len(lists):
        # 计算快慢指针的sum
        cur_sum += lists[fast]
        if cur_sum > sum:
            cur_sum -= lists[slow]
            slow += 1
        if cur_sum == sum:
            cur_len = fast - slow + 1
            # 有多个子序列的时候,取最大的
            current_max_subseq = max(cur_len,current_max_subseq)

        # fast指针到最后的时候,返回最大子序列
        if fast == len(lists) - 1:
            return current_max_subseq
        fast += 1

    return -1

标签:end,max,sum,长子,current,start,序列
From: https://www.cnblogs.com/njfl/p/18179809

相关文章

  • python教程6.3-json序列化
    序列化:dumps,编码,将python类型转成json对象反序列化:loads,解码,将json对象转成python对象pickle模块提供了四个功能:dumps、loads、dump、load(前2个操作变量,后2个操作文件)jsonjson模块也提供了四个功能:dumps、dump、loads、load,⽤法跟pickle⼀致。(前2个操作变量,后2个操作文件)......
  • Fastjson反序列化漏洞
    目录漏洞原理复现Fastjson1.2.24Fastjson1.2.47漏洞分析Fastjson是阿里巴巴开源的一个Java库,用于将Java对象转换为JSON字符串(序列化),以及将JSON字符串转换为Java对象(反序列化),漏洞编号CVE-2017-18349。漏洞原理Fastjson引入了autoType功能,允许在反序列化过程中通过@type......
  • 【Python-Json】自定义类输入json序列化、json的读取与写入
    AI问答Questionjson支持numpy数组么Answer不幸的是,标准的JSON格式不直接支持NumPy数组.JSON是一种用于存储和交换数据的文本格式,它有限的数据类型只包括对象(object)、数组(array)、数字(number)、字符串(string)、布尔值(true/false)、空值(null)等.因此,无法直接将......
  • 1. 实战7.4HDU1710-由先序和中序序列产生后序序列
    希冀平台:代码:#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>#include<stdlib.h>#include<map>#includ......
  • 循环编码:时间序列中周期性特征的一种常用编码方式
    在深度学习或神经网络中,"循环编码"(CyclicalEncoding)是一种编码技术,其特点是能够捕捉输入或特征中的周期性或循环模式。这种编码方法常用于处理具有周期性行为的任务,比如时间序列预测或理解展示周期性特征的序列。循环编码的核心思想是将数据的周期性特征转化为网络能够理解的形......
  • 力扣1218.最长定差子序列
    题目给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于difference。​ 子序列是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从arr派生出来的序列。解题思路​ 动态规划1.常......
  • 不同的子序列
    题目来源:力扣115解法思路:使用动态规划定义dp[i][j]为考虑s中[0,i-1]个字符,t中[0,j-1]个字符的匹配个数。那么显然对于某个dp[i][j]而言,从「最后一步」的匹配进行分析,包含两类决策:1、不让s[i]参与匹配,也就是需要让s中[0,i−1]个字符去匹配t中的[0,j-1]字符。此......
  • 基于WOA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真
    1.算法运行效果图预览优化前:    优化后:   2.算法运行软件版本matlab2022a 3.算法理论概述       时间序列回归预测是数据分析的重要领域,旨在根据历史数据预测未来时刻的数值。近年来,深度学习模型如卷积神经网络(ConvolutionalNeuralNetwork,C......
  • 修改序列last_value 字段
    在PostgreSQL中,你不能直接更新序列(如seq_sys_config)的last_value字段,因为序列是一个特殊的系统对象,不允许你像普通表那样直接修改它的列。last_value实际上是序列的一个伪列,表示最后返回的值,但它不是一个可以直接设置的列。如果你想要修改序列的当前值或者重置它,你应该使用......
  • LSTM时间序列预测中的一个常见错误以及如何修正
    当使用LSTM进行时间序列预测时,人们容易陷入一个常见的陷阱。为了解释这个问题,我们需要先回顾一下回归器和预测器是如何工作的。预测算法是这样处理时间序列的:一个回归问题是这样的:因为LSTM是一个回归量,我们需要把时间序列转换成一个回归问题。有许多方法可以做到这一点,一般......