📜  以 k 为最大元素的非重叠子数组的最大长度总和。

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

以 k 为最大元素的非重叠子数组的最大长度总和。

找到以 k 为最大元素的非重叠子数组(连续元素)的最大长度总和。
例子:

Input : arr[] = {2, 1, 4, 9, 2, 3, 8, 3, 4} 
        k = 4
Output : 5
{2, 1, 4} => Length = 3
{3, 4} => Length = 2
So, 3 + 2 = 5 is the answer

Input : arr[] = {1, 2, 3, 2, 3, 4, 1} 
        k = 4
Output : 7
{1, 2, 3, 2, 3, 4, 1} => Length = 7

Input : arr = {4, 5, 7, 1, 2, 9, 8, 4, 3, 1}
        k = 4
Ans = 4
{4} => Length = 1
{4, 3, 1} => Length = 3
So, 1 + 3 = 4 is the answer

问题来源: https://www.geeksforgeeks.org/amazon-interview-experience-set-376-campus-internship/

算法 :

Traverse the array starting from first element
   Take a loop and keep on incrementing count 
   If element is less than equal to k
       if array element is equal to k, then mark
       a flag
   
   If flag is marked, add this count to answer
   
   Take another loop and traverse the array 
   till element is greater than k
return ans
C++
// CPP program to calculate max sum lengths of
// non overlapping contiguous subarrays with k as
// max element
#include 
using namespace std;
  
// Returns max sum of lengths with maximum element
// as k
int calculateMaxSumLength(int arr[], int n, int k)
{
    int ans = 0; // final sum of lengths
  
    // number of elements in current subarray
    int count = 0;
  
    // variable for checking if k appeared in subarray
    int flag = 0;
  
    for (int i = 0; i < n;) {
        count = 0;
        flag = 0;
  
        // count the number of elements which are
        // less than equal to k
        while (arr[i] <= k && i < n) {
            count++;
            if (arr[i] == k)
                flag = 1;
            i++;
        }
  
        // if current element appeared in current
        // subarray add count to sumLength
        if (flag == 1)
            ans += count;   
  
        // skip the array elements which are
        // greater than k
        while (arr[i] > k && i < n)
            i++;    
    }
    return ans;
}
  
// driver program
int main()
{
    int arr[] = { 4, 5, 7, 1, 2, 9, 8, 4, 3, 1 };
    int size = sizeof(arr) / sizeof(arr[0]);
    int k = 4;
    int ans = calculateMaxSumLength(arr, size, k);
    cout << "Max Length :: " << ans << endl;
    return 0;
}


Java
// A Java program to calculate max sum lengths of
// non overlapping contiguous subarrays with k as
// max element
public class GFG
{
    // Returns max sum of lengths with maximum element
    // as k
    static int calculateMaxSumLength(int arr[], int n, int k) {
        int ans = 0; // final sum of lengths
 
        // number of elements in current subarray
        int count = 0;
 
        // variable for checking if k appeared in subarray
        int flag = 0;
 
        for (int i = 0; i < n;) {
            count = 0;
            flag = 0;
 
            // count the number of elements which are
            // less than equal to k
            while (i < n && arr[i] <= k) {
                count++;
                if (arr[i] == k)
                    flag = 1;
                i++;
            }
 
            // if current element appeared in current
            // subarray add count to sumLength
            if (flag == 1)
                ans += count;
 
            // skip the array elements which are
            // greater than k
            while (i < n && arr[i] > k)
                i++;
        }
        return ans;
    }
 
    // driver program to test above method
    public static void main(String[] args) {
 
        int arr[] = { 4, 5, 7, 1, 2, 9, 8, 4, 3, 1 };
        int size = arr.length;
        int k = 4;
        int ans = calculateMaxSumLength(arr, size, k);
        System.out.println("Max Length :: " + ans);
    }
}
// This code is contributed by Sumit Ghosh


Python3
# Python program to calculate max sum lengths of non
# overlapping contiguous subarrays with k as max element
 
# Returns max sum of lengths with max elements as k
def calculateMaxSumLength(arr, n, k):
    ans = 0 # final sum of lengths
    i=0
    while i < n :
         
        # number of elements in current sub array
        count = 0
         
        # Variable for checking if k appeared in the sub array
        flag = 0
         
        # Count the number of elements which are
        # less than or equal to k
        while i < n and arr[i] <= k :
            count = count + 1
            if arr[i] == k:
                flag = 1
            i = i + 1
             
        # if current element appeared in current
        # subarray and count to sumLength
        if flag == 1:
            ans = ans + count
             
        # skip the array elements which are greater than k
        while i < n and arr[i] > k :
            i = i + 1
              
    return ans
     
# Driver Program
arr = [4, 5, 7, 1, 2, 9, 8, 4, 3, 1]
size = len(arr)
k = 4
ans = calculateMaxSumLength(arr, size, k)
print ("Max Length ::",ans)
 
# Contributed by Rohit


C#
// A C# program to calculate max
// sum lengths of non overlapping
// contiguous subarrays with k as
// max element
using System;
class GFG {
     
    // Returns max sum of lengths
    // with maximum element as k
    static int calculateMaxSumLength(int []arr,
                                     int n,
                                     int k)
    {
         
        // final sum of lengths
        int ans = 0;
 
        // number of elements in
        // current subarray
        int count = 0;
 
        // variable for checking if
        // k appeared in subarray
        int flag = 0;
 
        for(int i = 0; i < n;)
        {
            count = 0;
            flag = 0;
 
            // count the number of
            // elements which are
            // less than equal to k
            while (i < n && arr[i] <= k)
            {
                count++;
                if (arr[i] == k)
                    flag = 1;
                i++;
            }
 
            // if current element
            // appeared in current
            // subarray add count
            // to sumLength
            if (flag == 1)
                ans += count;
 
            // skip the array
            // elements which are
            // greater than k
            while (i < n && arr[i] > k)
                i++;
        }
        return ans;
    }
 
    // Driver Code
    public static void Main()
    {
        int []arr = {4, 5, 7, 1, 2, 9, 8, 4, 3, 1};
        int size = arr.Length;
        int k = 4;
        int ans = calculateMaxSumLength(arr, size, k);
        Console.WriteLine("Max Length :: " + ans);
    }
}
 
// This code is contributed by anuj_67.


PHP
 $k && $i < $n)
            $i++;    
    }
    return $ans;
}
 
// Driver Code
$arr = array( 4, 5, 7, 1, 2,   
              9, 8, 4, 3, 1 );
$size = sizeof($arr);
$k = 4;
$ans = calculateMaxSumLength($arr, $size, $k);
echo "Max Length :: " . $ans . "\n";
 
// This code is contributed by ita_c
?>


Javascript


输出:

Max Length :: 4