码迷,mamicode.com
首页 > 编程语言 > 详细

[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度

时间:2019-05-09 00:34:07      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:[]   sum   解题思路   题意   return   复杂   str   break   数组   

题目描述

给定无序数组,每个值均为正数,再给定整数k。求arr中所有子数组中所有元素相加和为k的最长子数组长度。无则输出-1。
例:
输入 arr=[1,2,1,1,1],k=3
输出 3

解题思路 (时间复杂度O(N),空间复杂度O(1))

维护指针l,r表示子数组区间。初始l=r=0,向右移动至r=arr.length结束。
维护当前子数组和sum,及到当前为止满足题意的最大len。初始sum=arr[0],len=-1。
每次比较sum和k,根据情况选择移动l还是r,并更新sum和len。

代码

public static int longestEqualStrLen(int[] arr,int k) {
        int l=0;
        int r=0;
        int sum=arr[0];
        int len=-1; 
        while(r<arr.length) {
            if(sum<k) {
                r++;
                if(r==arr.length) {
                    break;
                }
                sum+=arr[r];
            }
            else if(sum>k) {
                l++;
                sum-=arr[l];
            }
            else {
                if(r-l+1>len) {
                    len=r-l+1;
                }
                l++;
                sum=-arr[l];
            }
        }
        return len;
    }

[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度

标签:[]   sum   解题思路   题意   return   复杂   str   break   数组   

原文地址:https://www.cnblogs.com/coding-gaga/p/10835790.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!