未排序正整数数组中累加和为给定值的最长子数组长度

题目:

给定一个数组arr,该数组无序,每个数正数,给定一个K,求arr的所有子数组中所有元素相加和为k的最长子数组的长度。

例如:arr=[1,2,1,1,1],k=3

结果是3,[1,1,1]的长度。

思路:

首先用两个位置来标记子数组左右两头,记为left与right,开始的时候都在数组的最左边即left=right=0,过程如下:

1,开始变量left=0,right=0,代表子数组arr[left,right];

2,变量sum始终表示子数组arr[left,right]的和,开始的时候sum= arr[0],即是arr[0,0]的和;

3,变量len一直记录累加和为k的所有子数组中最大子数组的长度,开始的时候len=0;

4,根据sum与k的比较结果决定是left移动还right移动。若干sum==K,说明arr[left,right]累加和为k,如果长度大于len,更新len

package Array;

import java.util.Scanner;

/**
 * Created by wuxiaosi on 2017/9/24.
 */
public class getMaxLength {
    public static void main(String[] args){
        int k=3;
        int[] arr={1,2,1,1,1};
        System.out.println(getMaxLengthK(arr,k));
    }
    public static int getMaxLengthK(int[] arr,int k){
        if(arr==null||arr.length==0||k<=0){
            return  0;
        }
        int left=0;
        int right=0;
        int sum=arr[0];
        int len=0;
        while(right<arr.length){
            if(sum==k){
                len = Math.max(len,right-left+1);
                sum=sum-arr[left++];
            }
            else if(sum<k){
                right++;//向右移动
                if(right==arr.length){//right到数组边界长度,就break
                    break;
                }
                sum=sum+arr[right];
            }else{
                sum=sum-arr[left++];
            }
        }
        return len;

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值