【华为OD题库-084】最长连续子序列-Java

题目

有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.
示例2:
输入

1,2,3,4,2

20
输出

-1
说明

没有满足要求的子序列,返回-1

思路

滑动窗口法,以示例数据为例:1 2 3 4 2,目标和targetSum为6

记i为窗口左边界,j为窗口右边界,输入的数组为nums,初始和为curSum=nums[0]

如果curSum<targetSum,那么将j右移动,并更新当前curSum+=nums[++j],先右移再更新,可能越界

如果curSum==targetSum,那么记录此时窗口的长度:j-i+1

如果curSum>targetSum,那么i右移,并更新当前curSum-=nums[i--],先更新再右移,不会越界

最后考虑窗口保证有效,i,j不得超过nums范围,循环条件注意加上:i<=j,否则:1 2 3 4 2,目标和为0,无法通过。

题解

java 复制代码
package hwod;

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

public class TheLongestContinueSubStr {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
        int sum = sc.nextInt();
        System.out.println(theLongestContinueSubStr(nums, sum));
    }

    private static int theLongestContinueSubStr(int[] nums, int sum) {
        int i = 0, j = 0, res = -1;
        int curSum = nums[0];
        while (i <= j && i < nums.length && j < nums.length) {
            if (curSum < sum) {
                j++;
                if (j < nums.length) curSum += nums[j];
            } else if (curSum >= sum) {
                if (curSum == sum) res = Math.max(res, j - i + 1);
                curSum -= nums[i];
                i++;
            }
        }
        return res;

    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

相关推荐
czhc114007566317 小时前
C# 1221
java·servlet·c#
黄俊懿17 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——全局事务的回滚
java·后端·spring·spring cloud·微服务·架构·架构师
派大鑫wink17 小时前
【Day12】String 类详解:不可变性、常用方法与字符串拼接优化
java·开发语言
JIngJaneIL17 小时前
基于springboot + vue健康管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端
秋饼17 小时前
【三大锁王争霸赛:Java锁、数据库锁、分布式锁谁是卷王?】
java·数据库·分布式
电商API&Tina17 小时前
【电商API接口】关于电商数据采集相关行业
java·python·oracle·django·sqlite·json·php
刘一说17 小时前
Spring Boot中IoC(控制反转)深度解析:从实现机制到项目实战
java·spring boot·后端
悟空码字17 小时前
SpringBoot参数配置:一场“我说了算”的奇幻之旅
java·spring boot·后端
我居然是兔子17 小时前
Java虚拟机(JVM)内存模型与垃圾回收全解析
java·开发语言·jvm
关于不上作者榜就原神启动那件事17 小时前
Spring Data Redis 中的 opsFor 方法详解
java·redis·spring