• 算法08未排序正数数组中累加和为给定值的最长连续子数组的长度


    描述

    给定一个数组arr,该数组无序,但每个值均为正数,再给定一个正数k。求arr的所有子数组中所有元素相加和为k的最长连续子数组的长度
    例如,arr = [1, 2, 1, 1, 1], k = 3
    累加和为3的最长连续子数组为[1, 1, 1],所以结果返回3
    [要求]
    时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)

    输入描述:

    第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出
    第二行N个整数表示数组内的数

    输出描述:

    输出一个整数表示答案

    示例1

    输入:
    5 3
    1 2 1 1 1
    
    输出:
    3

    思路

    双指针法,计算start和end指针之间的数字和;
    如果大于k,则sum减去arr[start],并start++;
    如果小于k ,先end++,再sum加上arr[end];
    如果等于k,则计算长度,sum减去arr[start]并start++;
    import java.util.Scanner;
    
    public class Main{
        
        public static void main(String[] args){
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int k = scanner.nextInt();
            int[] arr = new int[n];
            
            for(int i=0;i<n;i++){
                arr[i] = scanner.nextInt();
            }
            
            int start=0,end=0,sum=arr[start],maxLen=Integer.MIN_VALUE;
                while(end<n){
                    if(sum==k){
                        maxLen = Math.max(end - start + 1,maxLen);
                        sum -= arr[start++];
                    } else if(sum >k){
                        sum -= arr[start++];
                    } else {
                        end++;
                        if(end == n){
                            break;
                        }
                        sum += arr[end];
                    }
                }
          System.out.println(maxLen);
        }
    }
  • 相关阅读:
    【创建型】Singleton模式
    【创建型】Abstract Factory模式 & Factory Method模式
    红黑树插入操作
    红黑树删除操作
    bat命令中的变量声明及使用
    bat(传参情况下)取得当前bat所在的目录路径
    代理模式 -- 大话设计模式
    装饰模式 -- 大话设计模式
    依赖倒转原则 -- 大话设计模式
    开放封闭原则 -- 大话设计模式
  • 原文地址:https://www.cnblogs.com/sfnz/p/15787377.html
Copyright © 2020-2023  润新知