📌  相关文章
📜  查找严格递减的子数组的数量

📅  最后修改于: 2021-04-23 16:37:37             🧑  作者: Mango

给定整数数组A []。任务是计算严格减少的子数组(大小> 1)的总数。

例子

天真的方法:一个简单的解决方案是运行两个for循环并检查子数组是否在减少。
通过了解以下事实可以改善这一点:如果子数组arr [i:j]没有严格减小,则子数组arr [i:j + 1],arr [i:j + 2],.. arr [i:n- 1]不能严格减少。

高效方法:在上述解决方案中,我们对多个子数组进行了两次计数。这也可以进行改进,其思想基于以下事实:长度为len的已排序(递减)子数组将len *(len-1)/ 2加到结果中。

下面是上述方法的实现:

C++
// C++ program to count number of strictly
// decreasing subarrays in O(n) time.
  
#include 
using namespace std;
  
// Function to count the number of strictly
// decreasing subarrays
int countDecreasing(int A[], int n)
{
    int cnt = 0; // Initialize result
  
    // Initialize length of current
    // decreasing subarray
    int len = 1;
  
    // Traverse through the array
    for (int i = 0; i < n - 1; ++i) {
        // If arr[i+1] is less than arr[i],
        // then increment length
        if (A[i + 1] < A[i])
            len++;
  
        // Else Update count and reset length
        else {
            cnt += (((len - 1) * len) / 2);
            len = 1;
        }
    }
  
    // If last length is more than 1
    if (len > 1)
        cnt += (((len - 1) * len) / 2);
  
    return cnt;
}
  
// Driver program
int main()
{
    int A[] = { 100, 3, 1, 13 };
    int n = sizeof(A) / sizeof(A[0]);
  
    cout << countDecreasing(A, n);
  
    return 0;
}


Java
// Java program to count number of strictly
// decreasing subarrays in O(n) time.
  
import java.io.*;
  
class GFG {
  
  
// Function to count the number of strictly
// decreasing subarrays
static int countDecreasing(int A[], int n)
{
    int cnt = 0; // Initialize result
  
    // Initialize length of current
    // decreasing subarray
    int len = 1;
  
    // Traverse through the array
    for (int i = 0; i < n - 1; ++i) {
        // If arr[i+1] is less than arr[i],
        // then increment length
        if (A[i + 1] < A[i])
            len++;
  
        // Else Update count and reset length
        else {
            cnt += (((len - 1) * len) / 2);
            len = 1;
        }
    }
  
    // If last length is more than 1
    if (len > 1)
        cnt += (((len - 1) * len) / 2);
  
    return cnt;
}
  
// Driver program
    public static void main (String[] args) {
    int A[] = { 100, 3, 1, 13 };
    int n = A.length;
  
    System.out.println(countDecreasing(A, n));
    }
}
// This code is contributed by anuj_67..


Python 3
# Python 3 program to count number 
# of strictly decreasing subarrays
# in O(n) time.
  
# Function to count the number of
# strictly decreasing subarrays
def countDecreasing(A, n):
  
    cnt = 0 # Initialize result
  
    # Initialize length of current
    # decreasing subarray
    len = 1
  
    # Traverse through the array
    for i in range (n - 1) :
          
        # If arr[i+1] is less than arr[i],
        # then increment length
        if (A[i + 1] < A[i]):
            len += 1
  
        # Else Update count and 
        # reset length
        else :
            cnt += (((len - 1) * len) // 2);
            len = 1
      
    # If last length is more than 1
    if (len > 1):
        cnt += (((len - 1) * len) // 2)
  
    return cnt
  
# Driver Code
if __name__=="__main__":
  
    A = [ 100, 3, 1, 13 ]
    n = len(A)
  
    print (countDecreasing(A, n))
  
# This code is contributed by ChitraNayal


C#
// C# program to count number of strictly
// decreasing subarrays in O(n) time.
  
using System;
  
class GFG
{
// Function to count the number of strictly
// decreasing subarrays
static int countDecreasing(int []A, int n)
{
int cnt = 0; // Initialize result
  
// Initialize length of current
// decreasing subarray
int len = 1;
  
// Traverse through the array
for (int i = 0; i < n - 1; ++i) {
// If arr[i+1] is less than arr[i],
// then increment length
if (A[i + 1] < A[i])
len++;
  
// Else Update count and reset length
else {
cnt += (((len - 1) * len) / 2);
len = 1;
}
}
  
// If last length is more than 1
if (len > 1)
cnt += (((len - 1) * len) / 2);
  
return cnt;
}
  
// Driver code
static void Main()
{
int []A = { 100, 3, 1, 13 };
int n = A.Length ;
Console.WriteLine(countDecreasing(A, n));
}
// This code is contributed by ANKITRAI1
}


PHP
 1)
        $cnt += ((($len - 1) * $len) / 2);
  
    return $cnt;
}
  
// Driver Code
$A = array( 100, 3, 1, 13 );
$n = sizeof($A);
  
echo countDecreasing($A, $n);
  
// This code is contributed by mits
?>


输出:
3

时间复杂度: O(N)