zoukankan      html  css  js  c++  java
  • 算法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);
        }
    }
  • 相关阅读:
    Java学习笔记8(面向对象3:接口)
    面向对象2(继承,抽象类)
    java学习笔记6(面向对象1:概念,private)
    排序方法-循环和数组练习
    ArrayList方法综合练习
    Eclipse的配置
    集合(ArrayList)简述
    java学习笔记5(方法)
    数据结构9——最小生成树
    数据结构8——图的遍历
  • 原文地址:https://www.cnblogs.com/sfnz/p/15787377.html
Copyright © 2011-2022 走看看