华为OD-2024年E卷-最长连续子序列[100分] -- python

问题描述:

有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列,使他们的和等于sum,返回此子序列的长度,如果没有满足要求的序列,返回-1。
输入描述
序列:1,2,3,4,2 sum: 6
输出描述
序列长度:3
补充说明
输入序列仅由数字和英文逗号构成,数字之间采用英文逗号分隔;
序列长度:1<=N<=200;
输入序列不考虑异常情况,由题目保证输入序列满足要求。

1,2,3,4,2
6
3
#说明:1,2,3和4,2两个序列均能满足要求,所以最长的连续序列为1,2,3,因此结果为3
1,2,3,4,2
20
-1
#说明:没有满足要求的子序列,返回-1

解题思路:

求长度最长的连续子序列,使他们的和等于sum

直接遍历所有的子序列情况

但是这里我不用两层for循环,用双指针实现:

  1. left,right记录当前子序列的左右索引
  2. count记录当前子序列的和:累加right索引的值并更新right
  3. 如果count大于目标值,则处理下一个left(left += 1)
  4. 如果count等于目标值,则更新最大长度,更新left为right
  5. 如果count小于目标值,意味着无法满足要求,不用动,long为-1

代码实现:

arr = list(map(int,input().split(',')))
s = int(input())
left,right = 0,0
long = -1
while right < len(arr):
    count = 0
    while right < len(arr) and count < s:
        count += arr[right]
        right += 1
    if count == s:#符合要求,更新最大长度以及left
        long = max(long,right-left)
        left = right
    elif count > s:#大于目标值,处理下一个left
        left += 1
        right = left
print(long)

你可能感兴趣的:(华为od,链表,数据结构)