元素总和最多为“k”的最长子数组
给定一个整数数组,我们的目标是找到最大子数组的长度,其元素之和最多为 'k',其中 k>0。
例子:
Input : arr[] = {1, 2, 1, 0, 1, 1, 0}, k = 4
Output : 5
Explanation:
{1, 2, 1} => sum = 4, length = 3
{1, 2, 1, 0}, {2, 1, 0, 1} => sum = 4, length = 4
{1, 0, 1, 1, 0} =>5 sum = 3, length = 5
方法1(蛮力)
找出总和小于或等于 k 的所有子数组,并返回长度最大的子数组。
时间复杂度:O(n^2)
方法2(高效):
一种有效的方法是使用滑动窗口技术。
- 遍历数组并检查在添加当前元素时其总和是否小于或等于 k。
- 如果它小于 k 则将其添加到总和并增加计数。
- 跟踪最大计数。
C++
// A C++ program to find longest subarray with
// sum of elements at-least k.
#include
using namespace std;
// function to find the length of largest subarray
// having sum atmost k.
int atMostSum(int arr[], int n, int k)
{
int sum = 0;
int cnt = 0, maxcnt = 0;
for (int i = 0; i < n; i++) {
// If adding current element doesn't
// cross limit add it to current window
if ((sum + arr[i]) <= k) {
sum += arr[i];
cnt++;
}
// Else, remove first element of current
// window and add the current element
else if(sum!=0)
{
sum = sum - arr[i - cnt] + arr[i];
}
// keep track of max length.
maxcnt = max(cnt, maxcnt);
}
return maxcnt;
}
// Driver function
int main()
{
int arr[] = {1, 2, 1, 0, 1, 1, 0};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 4;
cout << atMostSum(arr, n, k);
return 0;
}
Java
// Java program to find longest subarray with
// sum of elements at-least k.
import java.util.*;
class GFG {
// function to find the length of largest
// subarray having sum atmost k.
public static int atMostSum(int arr[], int n,
int k)
{
int sum = 0;
int cnt = 0, maxcnt = 0;
for (int i = 0; i < n; i++) {
// If adding current element doesn't
// cross limit add it to current window
if ((sum + arr[i]) <= k) {
sum += arr[i];
cnt++;
}
// Else, remove first element of current
// window.
else if(sum!=0)
{
sum = sum - arr[i - cnt] + arr[i];
}
// keep track of max length.
maxcnt = Math.max(cnt, maxcnt);
}
return maxcnt;
}
/* Driver program to test above function */
public static void main(String[] args)
{
int arr[] = { 1, 2, 1, 0, 1, 1, 0 };
int n = arr.length;
int k = 4;
System.out.print(atMostSum(arr, n, k));
}
}
// This code is contributed by Arnav Kr. Mandal.
Python3
# Python3 program to find longest subarray
# with sum of elements at-least k.
# function to find the length of largest
# subarray having sum atmost k.
def atMostSum(arr, n, k):
_sum = 0
cnt = 0
maxcnt = 0
for i in range(n):
# If adding current element doesn't
# Cross limit add it to current window
if ((_sum + arr[i]) <= k):
_sum += arr[i]
cnt += 1
# Else, remove first element of current
# window and add the current element
else if(sum != 0):
_sum = _sum - arr[i - cnt] + arr[i]
# keep track of max length.
maxcnt = max(cnt, maxcnt)
return maxcnt
# Driver function
arr = [1, 2, 1, 0, 1, 1, 0]
n = len(arr)
k = 4
print(atMostSum(arr, n, k))
# This code is contributed by "Abhishek Sharma 44"
C#
// C# program to find longest subarray
// with sum of elements at-least k.
using System;
class GFG {
// function to find the length of largest
// subarray having sum atmost k.
public static int atMostSum(int []arr, int n,
int k)
{
int sum = 0;
int cnt = 0, maxcnt = 0;
for (int i = 0; i < n; i++) {
// If adding current element doesn't
// cross limit add it to current window
if ((sum + arr[i]) <= k) {
sum += arr[i];
cnt++;
}
// Else, remove first element
// of current window.
else if(sum!=0)
{
sum = sum - arr[i - cnt] + arr[i];
}
// keep track of max length.
maxcnt = Math.Max(cnt, maxcnt);
}
return maxcnt;
}
// Driver Code
public static void Main()
{
int []arr = {1, 2, 1, 0, 1, 1, 0};
int n = arr.Length;
int k = 4;
Console.Write(atMostSum(arr, n, k));
}
}
// This code is contributed by Nitin Mittal
PHP
Javascript
输出:
5