📌  相关文章
📜  元素总和最多为“k”的最长子数组

📅  最后修改于: 2022-05-13 01:57:47.826000             🧑  作者: Mango

元素总和最多为“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(高效):
一种有效的方法是使用滑动窗口技术。

  1. 遍历数组并检查在添加当前元素时其总和是否小于或等于 k。
  2. 如果它小于 k 则将其添加到总和并增加计数。
  3. 跟踪最大计数。
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