Diferencias entre el número de subarreglos crecientes y subarreglos decrecientes en ventanas de tamaño k

Dada una array de enteros y k, encuentre la diferencia entre el número de subarreglos estrictamente crecientes (de tamaño superior a uno) y el número de subarreglos estrictamente decrecientes en la ventana de tamaño k. 

Ejemplos: 

Input : nums = {10, 20, 30, 15, 15}; 
           k = 3; 
Output : 3, 0, -1 
Explanation 
For the first window of [10, 20, 30], there are 
3 increasing subranges ([10, 20, 30], [10, 20], 
and [20, 30]) and 0 decreasing, so the answer 
is 3. For the second window of [20, 30, 15], 
there is 1 increasing subrange and 1 decreasing, 
so the answer is 0. For the third window of 
[20, 15, 15], there is 1 decreasing subrange 
and 0 increasing, so the answer is -1. 

Necesitamos calcular la diferencia entre los subarreglos crecientes y decrecientes para cada una de las ventanas de tamaño K. Iteramos a través de la array y para cada ventana de tamaño k, calculamos el número de subarreglos crecientes y decrecientes e insertamos la diferencia de ellos en la array de salida. 

  1. Cree dos arrays de tamaño N e inicialícelas en cero y cree la array de salida.
  2. Iterar a través de la array
  3. Calcular el número de subarreglos crecientes
  4. Calcular los subarreglos decrecientes
  5. Inserte la diferencia entre subarreglos crecientes y decrecientes en la array de salida.

Tiempo Complejidad de la solución: O(n*k) 
n = Tamaño de la array 
k = Tamaño de la ventana 

Implementación:

C++

// CPP program to count the differences
#include <iostream>
#include <vector>
using namespace std;
 
// function to calculate the difference
vector<int> Diffs(vector<int> const& a, int k)
{
    vector<int> out;
    vector<int> inc, dec;
 
    // initializing inc and dec with 0 and resizing
    // equal to the size of main array
    inc.resize(a.size(), 0);
    dec.resize(a.size(), 0);
 
    int inc_sum = 0;
    int dec_sum = 0;
 
    // iterate through the array
    for (int i = 0; i < a.size(); ++i) {
 
        // finding number of increasing
        // subarrays in a window size k
        for (int j = i - 1; j >= 0 && j > i - k &&
                           a[j + 1] > a[j]; --j) {
            ++inc[j];
            ++inc_sum;
        }
 
        // Finding number of decreasing subarrays
        // in a window size k
        for (int j = i - 1; j >= 0 && j > i - k &&
                            a[j + 1] < a[j]; --j) {
            ++dec[j];
            ++dec_sum;
        }
 
        // calculate the difference
        if (i >= k - 1) {
 
            // if this is not the first window then
            // calculate inc_sum and dec_sum
            if (i >= k) {
                inc_sum -= inc[i - k];
                dec_sum -= dec[i - k];
            }
 
            // insert the difference in k size window
            // in the output vector
            out.push_back(inc_sum - dec_sum);
        }
    }
    return out;
}
 
// driver program
int main()
{
    vector<int> out = Diffs({ 10, 20, 30, 15, 15}, 3);
    for (int n : out)
        cout << n << ", ";
     
    return 0;
}

Java

// JAVA program to count the differences
import java.util.*;
 
class GFG
{
 
// function to calculate the difference
static Vector<Integer> Diffs(int []a, int k)
{
    Vector<Integer> out = new Vector<Integer>();
    int [] inc, dec;
 
    // initializing inc and dec with 0 and resizing
    // equal to the size of main array
    inc = new int[a.length];
    dec = new int[a.length];
 
    int inc_sum = 0;
    int dec_sum = 0;
 
    // iterate through the array
    for (int i = 0; i < a.length; ++i)
    {
 
        // finding number of increasing
        // subarrays in a window size k
        for (int j = i - 1; j >= 0 && j > i - k &&
                        a[j + 1] > a[j]; --j)
        {
            ++inc[j];
            ++inc_sum;
        }
 
        // Finding number of decreasing subarrays
        // in a window size k
        for (int j = i - 1; j >= 0 && j > i - k &&
                            a[j + 1] < a[j]; --j)
        {
            ++dec[j];
            ++dec_sum;
        }
 
        // calculate the difference
        if (i >= k - 1)
        {
 
            // if this is not the first window then
            // calculate inc_sum and dec_sum
            if (i >= k)
            {
                inc_sum -= inc[i - k];
                dec_sum -= dec[i - k];
            }
 
            // insert the difference in k size window
            // in the output vector
            out.add(inc_sum - dec_sum);
        }
    }
    return out;
}
 
// Driver code
public static void main(String[] args)
{
    int []arr = { 10, 20, 30, 15, 15};
    Vector<Integer>out = Diffs(arr, 3);
    for (int n : out)
        System.out.print(n + ", ");
}
}
 
// This code is contributed by PrinciRaj1992

Python3

# Python3 program to count the differences
 
# Function to calculate the difference
def Diffs(a, k):
 
    out, inc, dec = [], [0] * len(a), [0] * len(a)
 
    # Initializing inc and dec with 0 and
    # resizing equal to the size of main array
    inc_sum, dec_sum = 0, 0
 
    # Iterate through the array
    for i in range(0, len(a)):
 
        # Finding number of increasing
        # subarrays in a window size k
        j = i - 1
        while (j >= 0 and j > i - k and
                        a[j + 1] > a[j]):
            inc[j] += 1
            inc_sum += 1
            j -= 1
 
        # Finding number of decreasing
        # subarrays in a window size k
        j = i - 1
        while (j >= 0 and j > i - k and
                        a[j + 1] < a[j]):
            dec[j] += 1
            dec_sum += 1
            j -= 1
 
        # calculate the difference
        if i >= k - 1:
 
            # if this is not the first window then
            # calculate inc_sum and dec_sum
            if i >= k:
                inc_sum -= inc[i - k]
                dec_sum -= dec[i - k]
             
            # insert the difference in k size window
            # in the output vector
            out.append(inc_sum - dec_sum)
         
    return out
 
# Driver Code
if __name__ == "__main__":
 
    out = Diffs([10, 20, 30, 15, 15], 3)
    for n in out:
        print(n, end = ", ")
     
# This code is contributed by Rituraj Jain

C#

// C# program to count the differences
using System;
using System.Collections.Generic;
 
class GFG
{
 
// function to calculate the difference
static List<int> Diffs(int []a, int k)
{
    List<int> Out = new List<int>();
    int [] inc, dec;
 
    // initializing inc and dec with 0 and resizing
    // equal to the size of main array
    inc = new int[a.Length];
    dec = new int[a.Length];
 
    int inc_sum = 0;
    int dec_sum = 0;
 
    // iterate through the array
    for (int i = 0; i < a.Length; ++i)
    {
 
        // finding number of increasing
        // subarrays in a window size k
        for (int j = i - 1; j >= 0 && j > i - k &&
                        a[j + 1] > a[j]; --j)
        {
            ++inc[j];
            ++inc_sum;
        }
 
        // Finding number of decreasing subarrays
        // in a window size k
        for (int j = i - 1; j >= 0 && j > i - k &&
                            a[j + 1] < a[j]; --j)
        {
            ++dec[j];
            ++dec_sum;
        }
 
        // calculate the difference
        if (i >= k - 1)
        {
 
            // if this is not the first window then
            // calculate inc_sum and dec_sum
            if (i >= k)
            {
                inc_sum -= inc[i - k];
                dec_sum -= dec[i - k];
            }
 
            // insert the difference in k size window
            // in the output vector
            Out.Add(inc_sum - dec_sum);
        }
    }
    return Out;
}
 
// Driver code
public static void Main(String[] args)
{
    int []arr = { 10, 20, 30, 15, 15};
    List<int>Out = Diffs(arr, 3);
    foreach (int n in Out)
        Console.Write(n + ", ");
}
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
// Js program to count the differences
 
// function to calculate the difference
function Diffs( a, k)
{
    let out = [];
    let inc, dec;
 
         
    // initializing inc and dec with 0 and resizing
    // equal to the size of main array
    inc = [];
    dec = [];
    for(let i = 0;i<a.length;i++){
        inc.push(0);
        dec.push(0);
    }
    let inc_sum = 0;
    let dec_sum = 0;
 
    // iterate through the array
    for (let i = 0; i < a.length; ++i) {
 
        // finding number of increasing
        // subarrays in a window size k
        for (let j = i - 1; j >= 0 && j > i - k &&
                           a[j + 1] > a[j]; --j) {
            ++inc[j];
            ++inc_sum;
        }
 
        // Finding number of decreasing subarrays
        // in a window size k
        for (let j = i - 1; j >= 0 && j > i - k &&
                            a[j + 1] < a[j]; --j) {
            ++dec[j];
            ++dec_sum;
        }
 
        // calculate the difference
        if (i >= k - 1) {
 
            // if this is not the first window then
            // calculate inc_sum and dec_sum
            if (i >= k) {
                inc_sum -= inc[i - k];
                dec_sum -= dec[i - k];
            }
 
            // insert the difference in k size window
            // in the output vector
            out.push(inc_sum - dec_sum);
        }
    }
    return out;
}
 
// driver program
let out = Diffs([10, 20, 30, 15, 15], 3);
document.write(out)
 
// This code is contributed by rohitsingh07052.
</script>

Producción: 

3, 0, -1, 

Publicación traducida automáticamente

Artículo escrito por niteesh_Kr y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *