📌  相关文章
📜  计算严格递增的子数组

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

计算严格递增的子数组

给定一个整数数组,计算严格增加的子数组(大小大于一)的数量。
预期时间复杂度: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