最长连续子序列 - 华为OD统一考试(E卷)

OD统一考试(E卷)

分值: 100分

题解: Java / Python / C++

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集

华为od机试

题目描述

有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列,使他们的和等于sum,返回此子序列的长度,

如果没有满足要求的序列,返回-1。

输入描述

第一行输入是:N个正整数组成的一个序列。

第二行输入是:给定整数 sum。

输出描述

最长的连续子序列的长度。

备注

  • 输入序列仅由数字和英文逗号构成,数字之间采用英文逗号分隔
  • 序列长度:1 <= N <= 200
  • 输入序列不考虑异常情况

示例1

输入:
1,2,3,4,2
6

输出:
3

说明:
1,2,3和4,2两个序列均能满足要求,所以最长的连续序列为1,2,3,因此结果为3。

题解

这个题目属于“滑动窗口”或“双指针”类型的题目,目的是在一个整数数组中找到和等于给定整数 sum 的连续子序列,并返回此子序列的最大长度。如果没有满足要求的序列,返回 -1。

解题思路

  1. 滑动窗口:我们可以使用两个指针(或称作滑动窗口的左右边界),用一个窗口表示当前的子序列。我们逐渐向右移动右边界来扩大窗口,当窗口内的和超过 sum 时,我们移动左边界来缩小窗口。当窗口内的和刚好等于 sum 时,记录窗口的长度,并与当前最长的长度比较。
  2. 步骤
    • 初始化两个指针 leftright,表示窗口的左右边界,left 从序列开始,right 开始遍历序列。
    • 使用一个变量 current_sum 记录当前窗口的元素和。
    • 如果 current_sum 大于 sum,则需要收缩左边界(移动 left),直到 current_sum 小于等于 sum
    • 如果 current_sum 等于 sum,更新最长子序列的长度。
    • 重复这个过程直到 right 遍历完序列。
  3. 时间复杂度:由于每个元素最多会被访问两次(一次作为右边界,一次作为左边界),所以时间复杂度为 O(N),其中 N 是数组的长度。

Java

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {
    public static int longestSubsequenceWithSum(int[] nums, int targetSum) {
        int n = nums.length;
        int left = 0, currentSum = 0, maxLength = -1;

        for (int right = 0; right < n; right++) {
            currentSum += nums[right];

            // 当当前窗口的和大于目标值时,缩小窗口
            while (currentSum > targetSum) {
                currentSum -= nums[left];
                left++;
            }

            // 如果当前窗口的和等于目标值,更新最大长度
            if (currentSum == targetSum) {
                maxLength = Math.max(maxLength, right - left + 1);
            }
    

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

华为OD机试题库题解2024 文章被收录于专栏

华为OD机考(CDE卷)题库(绝对都是原题),帮助你上岸华为(已经不少小伙伴成功上岸)。提供Java、Python、C++ 三种语言的解法。每篇文章都有详细的解题步骤、代码注释详细及相关知识点的练习题。有问题,随时解答。

全部评论
动态规划,dp[i] 表示连续递增或递减最大序列长度
点赞 回复 分享
发布于 2024-10-27 20:15 上海

相关推荐

从24年初开学开始接触到前端,和实验室几个同学一起学习,可似乎我总比他们慢一步,每每学完一个地方,我掌握的程度好像都不比他们,第一次实验室的任务实战,我两眼一抹黑,完全不知道从何下手,而他们却是游刃有余,可我当时没有丧气,只有一个念头,既然学习能力不如他们,那我就拿更多的时间去学,于是我把打游戏,运动锻炼的时间也拿来学习。到了暑假,实验室一起做项目,为了可以更好的参与进去,于是我暑假开始留校和同学师哥一起做项目,每天早上九点多去实验室,晚上十点多回宿舍,校田径队的训练没有去,中间也只回家待了一周。到暑假结束开学之后,一位很优秀的师哥拿到了几个offer,我从他身上看到了希望,双非本科就业的希望...
offer求求哩:我的评价是认知低,建议多看书,认知低的一个表现是人生仿佛没考上大学就是进厂,考上了就是考研考公找工作。股市里有一个很有意思的故事,说的是当门口大妈都在谈论股票的时候,说明行情已经见顶了。当你的父母在某些事上没有成功却支持你说明事情可能已经不可靠了,但在某些事上反对你,说明这件事可能还有成功的可能。(仅个人观点)😆😆
点赞 评论 收藏
分享
2024-12-09 17:16
海南大学 Java
点赞 评论 收藏
分享
01-15 13:52
已编辑
河南大学 Java
CoderEcho:牌子✌🏻
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务