计算严格递增的子数组
给定一个整数数组,计算严格增加的子数组(大小大于一)的数量。
预期时间复杂度:O(n)
预期的额外空间:O(1)
例子:
Input: arr[] = {1, 4, 3}
Output: 1
There is only one subarray {1, 4}
Input: arr[] = {1, 2, 3, 4}
Output: 6
There are 6 subarrays {1, 2}, {1, 2, 3}, {1, 2, 3, 4}
{2, 3}, {2, 3, 4} and {3, 4}
Input: arr[] = {1, 2, 2, 4}
Output: 2
There are 2 subarrays {1, 2} and {2, 4}
我们强烈建议您单击此处并进行练习,然后再继续使用解决方案。
一个简单的解决方案是生成所有可能的子数组,并为每个子数组检查子数组是否严格增加。该解决方案的最坏情况时间复杂度为 O(n 3 )。
一个更好的解决方案是利用这样一个事实,如果子数组 arr[i:j] 不是严格递增的,那么子数组 arr[i:j+1], arr[i:j+2], .. arr[i:n- 1] 不能严格递增。下面是基于上述思想的程序。
C++
// C++ program to count number of strictly
// increasing subarrays
#include
using namespace std;
int countIncreasing(int arr[], int n)
{
// Initialize count of subarrays as 0
int cnt = 0;
// Pick starting point
for (int i=0; i arr[j-1])
cnt++;
// If subarray arr[i..j] is not strictly
// increasing, then subarrays after it , i.e.,
// arr[i..j+1], arr[i..j+2], .... cannot
// be strictly increasing
else
break;
}
}
return cnt;
}
// Driver program
int main()
{
int arr[] = {1, 2, 2, 4};
int n = sizeof(arr)/sizeof(arr[0]);
cout << "Count of strictly increasing subarrays is "
<< countIncreasing(arr, n);
return 0;
}
Java
// Java program to count number of strictly
// increasing subarrays
class Test
{
static int arr[] = new int[]{1, 2, 2, 4};
static int countIncreasing(int n)
{
// Initialize count of subarrays as 0
int cnt = 0;
// Pick starting point
for (int i=0; i arr[j-1])
cnt++;
// If subarray arr[i..j] is not strictly
// increasing, then subarrays after it , i.e.,
// arr[i..j+1], arr[i..j+2], .... cannot
// be strictly increasing
else
break;
}
}
return cnt;
}
// Driver method to test the above function
public static void main(String[] args)
{
System.out.println("Count of strictly increasing subarrays is " +
countIncreasing(arr.length));
}
}
Python3
# Python3 program to count number
# of strictly increasing subarrays
def countIncreasing(arr, n):
# Initialize count of subarrays as 0
cnt = 0
# Pick starting point
for i in range(0, n) :
# Pick ending point
for j in range(i + 1, n) :
if arr[j] > arr[j - 1] :
cnt += 1
# If subarray arr[i..j] is not strictly
# increasing, then subarrays after it , i.e.,
# arr[i..j+1], arr[i..j+2], .... cannot
# be strictly increasing
else:
break
return cnt
# Driver code
arr = [1, 2, 2, 4]
n = len(arr)
print ("Count of strictly increasing subarrays is",
countIncreasing(arr, n))
# This code is contributed by Shreyanshi Arun.
C#
// C# program to count number of
// strictly increasing subarrays
using System;
class Test
{
static int []arr = new int[]{1, 2, 2, 4};
static int countIncreasing(int n)
{
// Initialize count of subarrays as 0
int cnt = 0;
// Pick starting point
for (int i = 0; i < n; i++)
{
// Pick ending point
for (int j = i + 1; j < n; j++)
{
if (arr[j] > arr[j - 1])
cnt++;
// If subarray arr[i..j] is not strictly
// increasing, then subarrays after it ,
// i.e., arr[i..j+1], arr[i..j+2], ....
// cannot be strictly increasing
else
break;
}
}
return cnt;
}
// Driver Code
public static void Main(String[] args)
{
Console.Write("Count of strictly increasing" +
"subarrays is " + countIncreasing(arr.Length));
}
}
// This code is contributed by parashar.
PHP
$arr[$j-1])
$cnt++;
// If subarray arr[i..j] is
// not strictly increasing,
// then subarrays after it,
// i.e., arr[i..j+1],
// arr[i..j+2], .... cannot
// be strictly increasing
else
break;
}
}
return $cnt;
}
// Driver program
$arr = array(1, 2, 2, 4);
$n = count($arr);
echo "Count of strictly increasing ",
"subarrays is ",
countIncreasing($arr, $n);
// This code is contributed by anuj_67.
?>
Javascript
C++
// C++ program to count number of strictly
// increasing subarrays in O(n) time.
#include
using namespace std;
int countIncreasing(int arr[], int n)
{
int cnt = 0; // Initialize result
// Initialize length of current increasing
// subarray
int len = 1;
// Traverse through the array
for (int i=0; i < n-1; ++i)
{
// If arr[i+1] is greater than arr[i],
// then increment length
if (arr[i + 1] > arr[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 arr[] = {1, 2, 2, 4};
int n = sizeof(arr)/sizeof(arr[0]);
cout << "Count of strictly increasing subarrays is "
<< countIncreasing(arr, n);
return 0;
}
Java
// Java program to count number of strictly
// increasing subarrays
class Test
{
static int arr[] = new int[]{1, 2, 2, 4};
static int countIncreasing(int n)
{
int cnt = 0; // Initialize result
// Initialize length of current increasing
// subarray
int len = 1;
// Traverse through the array
for (int i=0; i < n-1; ++i)
{
// If arr[i+1] is greater than arr[i],
// then increment length
if (arr[i + 1] > arr[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 method to test the above function
public static void main(String[] args)
{
System.out.println("Count of strictly increasing subarrays is " +
countIncreasing(arr.length));
}
}
Python3
# Python3 program to count number of
# strictlyincreasing subarrays in O(n) time.
def countIncreasing(arr, n):
cnt = 0 # Initialize result
# Initialize length of current
# increasing subarray
len = 1
# Traverse through the array
for i in range(0, n - 1) :
# If arr[i+1] is greater than arr[i],
# then increment length
if arr[i + 1] > arr[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 program
arr = [1, 2, 2, 4]
n = len(arr)
print ("Count of strictly increasing subarrays is",
int(countIncreasing(arr, n)))
# This code is contributed by Shreyanshi Arun.
C#
// C# program to count number of strictly
// increasing subarrays
using System;
class GFG {
static int []arr = new int[]{1, 2, 2, 4};
static int countIncreasing(int n)
{
int cnt = 0; // Initialize result
// Initialize length of current
// increasing subarray
int len = 1;
// Traverse through the array
for (int i = 0; i < n-1; ++i)
{
// If arr[i+1] is greater than
// arr[i], then increment length
if (arr[i + 1] > arr[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 method to test the
// above function
public static void Main()
{
Console.WriteLine("Count of strictly "
+ "increasing subarrays is "
+ countIncreasing(arr.Length));
}
}
// This code is contribute by anuj_67.
PHP
$arr[$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
$arr = array(1, 2, 2, 4);
$n = count($arr);
echo "Count of strictly increasing subarrays is "
, countIncreasing($arr, $n);
// This code is contribute by anuj_67
?>
Javascript
输出 :
Count of strictly increasing subarrays is 2
上述解决方案的时间复杂度为 O(m),其中 m 是输出中的子数组数
这个问题和解决方案由 Rahul Agrawal 提供。
一个有效的解决方案可以在 O(n) 时间内计算子数组。这个想法是基于这样一个事实,即长度为“len”的排序子数组将 len*(len-1)/2 添加到结果中。例如,{10, 20, 30, 40} 将 6 添加到结果中。
C++
// C++ program to count number of strictly
// increasing subarrays in O(n) time.
#include
using namespace std;
int countIncreasing(int arr[], int n)
{
int cnt = 0; // Initialize result
// Initialize length of current increasing
// subarray
int len = 1;
// Traverse through the array
for (int i=0; i < n-1; ++i)
{
// If arr[i+1] is greater than arr[i],
// then increment length
if (arr[i + 1] > arr[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 arr[] = {1, 2, 2, 4};
int n = sizeof(arr)/sizeof(arr[0]);
cout << "Count of strictly increasing subarrays is "
<< countIncreasing(arr, n);
return 0;
}
Java
// Java program to count number of strictly
// increasing subarrays
class Test
{
static int arr[] = new int[]{1, 2, 2, 4};
static int countIncreasing(int n)
{
int cnt = 0; // Initialize result
// Initialize length of current increasing
// subarray
int len = 1;
// Traverse through the array
for (int i=0; i < n-1; ++i)
{
// If arr[i+1] is greater than arr[i],
// then increment length
if (arr[i + 1] > arr[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 method to test the above function
public static void main(String[] args)
{
System.out.println("Count of strictly increasing subarrays is " +
countIncreasing(arr.length));
}
}
Python3
# Python3 program to count number of
# strictlyincreasing subarrays in O(n) time.
def countIncreasing(arr, n):
cnt = 0 # Initialize result
# Initialize length of current
# increasing subarray
len = 1
# Traverse through the array
for i in range(0, n - 1) :
# If arr[i+1] is greater than arr[i],
# then increment length
if arr[i + 1] > arr[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 program
arr = [1, 2, 2, 4]
n = len(arr)
print ("Count of strictly increasing subarrays is",
int(countIncreasing(arr, n)))
# This code is contributed by Shreyanshi Arun.
C#
// C# program to count number of strictly
// increasing subarrays
using System;
class GFG {
static int []arr = new int[]{1, 2, 2, 4};
static int countIncreasing(int n)
{
int cnt = 0; // Initialize result
// Initialize length of current
// increasing subarray
int len = 1;
// Traverse through the array
for (int i = 0; i < n-1; ++i)
{
// If arr[i+1] is greater than
// arr[i], then increment length
if (arr[i + 1] > arr[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 method to test the
// above function
public static void Main()
{
Console.WriteLine("Count of strictly "
+ "increasing subarrays is "
+ countIncreasing(arr.Length));
}
}
// This code is contribute by anuj_67.
PHP
$arr[$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
$arr = array(1, 2, 2, 4);
$n = count($arr);
echo "Count of strictly increasing subarrays is "
, countIncreasing($arr, $n);
// This code is contribute by anuj_67
?>
Javascript
输出 :
Count of strictly increasing subarrays is 2