给定整数数组A []。任务是计算严格减少的子数组(大小> 1)的总数。
例子:
Input : A[] = { 100, 3, 1, 15 }
Output : 3
Subarrays are -> { 100, 3 }, { 100, 3, 1 }, { 3, 1 }
Input : A[] = { 4, 2, 2, 1 }
Output : 2
天真的方法:一个简单的解决方案是运行两个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)