[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度
Posted coding-gaga
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度相关的知识,希望对你有一定的参考价值。
题目描述
给定无序数组,每个值均为正数,再给定整数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;
}
以上是关于[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度的主要内容,如果未能解决你的问题,请参考以下文章
《程序员代码面试指南》第八章 数组和矩阵问题 自然数数组的排序
《程序员代码面试指南》第八章 数组和矩阵问题 需要排序的最短子数组长度
[程序员代码面试指南]数组和矩阵问题-数组排序后相邻数的最大差值(桶排序思想)
[程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)