📌  相关文章
📜  最长递增圆形子数组的长度

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

最长递增圆形子数组的长度

给定一个包含n 个数字的数组。问题是以循环方式找到最长连续子数组的长度,使得子数组中的每个元素都严格大于同一子数组中的前一个元素。时间复杂度应该是 O(n)。

例子:

Input : arr[] = {2, 3, 4, 5, 1}
Output : 5
{2, 3, 4, 5, 1} is the subarray if we circularly
start from the last element and then take the
first four elements. This will give us an increasing
subarray {1, 2, 3, 4, 5} in a circular manner.

Input : arr[] = {2, 3, 8, 4, 6, 7, 10, 12, 9, 1}
Output : 5

方法 1(使用额外空间):创建一个大小为 2*n 的 temp[] 数组。在 temp[] 中复制 arr[] 的元素两次。现在,在 temp[] 中找到最长递增子数组的长度。

方法2(不使用额外空间):以下是步骤:

  1. 如果 n == 1,则返回 1。
  2. 查找从 arr[] 的第一个元素开始的最长递增子数组的长度。让它的长度为startLen
  3. 从第一个递增子数组结束的下一个元素开始,找到最长递增子数组的长度。让它成为max
  4. 考虑以 arr[] 的最后一个元素结尾的递增子数组的长度。让它成为endLen
  5. 如果 arr[n-1] < arr[0],则endLen = endLen + startLen。
  6. 最后,返回 (max, endLen, startLen) 的最大值。
C++
// C++ implementation to find length of longest
// increasing circular subarray
#include 
using namespace std;
 
// function to find length of longest
// increasing circular subarray
int longlenCircularSubarr(int arr[], int n)
{
    // if there is only one element
    if (n == 1)
        return 1;
 
    // 'startLen' stores the length of the longest
    // increasing subarray which starts from
    // first element
    int startLen = 1, i;
    int len = 1, max = 0;
 
    // finding the length of the longest
    // increasing subarray starting from
    // first element
    for (i = 1; i < n; i++) {
        if (arr[i - 1] < arr[i])
            startLen++;
        else
            break;
    }
 
    if (max < startLen)
        max = startLen;
 
    // traverse the array index (i+1)
    for (int j = i + 1; j < n; j++) {
 
        // if current element if greater than previous
        // element, then this element helps in building
        // up the previous increasing subarray encountered
        // so far
        if (arr[j - 1] < arr[j])
            len++;
        else {
 
            // check if 'max' length is less than the length
            // of the current increasing subarray. If true,
            // then update 'max'
            if (max < len)
                max = len;
 
            // reset 'len' to 1 as from this element
            // again the length of the new increasing
            // subarray is being calculated
            len = 1;
        }
    }
 
    // if true, then add length of the increasing
    // subarray ending at last element with the
    // length of the increasing subarray starting
    // from first element - This is done for
    // circular rotation
    if (arr[n - 1] < arr[0])
        len += startLen;
 
    // check if 'max' length is less than the length
    // of the current increasing subarray. If true,
    // then update 'max'
    if (max < len)
        max = len;
 
    return max;
}
 
// Driver program to test above
int main()
{
    int arr[] = { 2, 3, 4, 5, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << "Length = "
         << longlenCircularSubarr(arr, n);
    return 0;
}


Java
// Java implementation to find length
// of longest increasing circular subarray
 
class Circular
{
    // function to find length of longest
    // increasing circular subarray
    public static int longlenCircularSubarr(int arr[],
                                               int n)
    {
        // if there is only one element
        if (n == 1)
            return 1;
 
        // 'startLen' stores the length of the
        // longest increasing subarray which
        // starts from first element
        int startLen = 1, i;
        int len = 1, max = 0;
 
        // finding the length of the longest
        // increasing subarray starting from
        // first element
        for (i = 1; i < n; i++) {
            if (arr[i - 1] < arr[i])
                startLen++;
            else
                break;
        }
 
        if (max < startLen)
            max = startLen;
 
        // traverse the array index (i+1)
        for (int j = i + 1; j < n; j++) {
 
            // if current element if greater than
            // previous element, then this element
            // helps in building up the previous
            // increasing subarray encountered so far
            if (arr[j - 1] < arr[j])
                len++;
            else {
 
                // check if 'max' length is less than
                // the length of the current increasing
                // subarray. If true, then update 'max'
                if (max < len)
                    max = len;
     
                // reset 'len' to 1 as from this element
                // again the length of the new increasing
                // subarray is being calculated
                len = 1;
            }
        }
 
        // if true, then add length of the increasing
        // subarray ending at last element with the
        // length of the increasing subarray starting
        // from first element - This is done for
        // circular rotation
        if (arr[n - 1] < arr[0])
            len += startLen;
 
        // check if 'max' length is less than the
        // length of the current increasing subarray.
        // If true, then update 'max'
        if (max < len)
            max = len;
 
        return max;
    }
     
    // driver code
    public static void main(String[] args)
    {
        int arr[] = { 2, 3, 4, 5, 1 };
        int n = 5;
        System.out.print("Length = "+
                      longlenCircularSubarr(arr, n));
    }
}
 
// This code is contributed by rishabh_jain


Python3
# Python3 implementation to find length
# of longest increasing circular subarray
 
# function to find length of longest
# increasing circular subarray
def longlenCircularSubarr (arr, n):
     
    # if there is only one element
    if n == 1:
        return 1
     
    # 'startLen' stores the length of the
    # longest increasing subarray which
    # starts from first element
    startLen = 1
     
    len = 1
    max = 0
     
    # finding the length of the longest
    # increasing subarray starting from
    # first element
    for i in range(1, n):
        if arr[i - 1] < arr[i]:
            startLen+=1
        else:
            break
     
    if max < startLen:
        max = startLen
         
    # traverse the array index (i+1)
    for j in range(i + 1, n):
         
        # if current element if greater than
        # previous element, then this element
        # helps in building up the previous
        # increasing subarray encountered
        # so far
        if arr[j - 1] < arr[j]:
            len+=1
        else:
            # check if 'max' length is less
            # than the length of the current
            # increasing subarray. If true,
            # then update 'max'
            if max < len:
                max = len
             
            # reset 'len' to 1 as from this
            # element again the length of the
            # new increasing subarray is
            # being calculated
            len = 1
             
    # if true, then add length of the increasing
    # subarray ending at last element with the
    # length of the increasing subarray starting
    # from first element - This is done for
    # circular rotation
    if arr[n - 1] < arr[0]:
        len += startLen
     
    # check if 'max' length is less than the
    # length of the current increasing subarray.
    # If true, then update 'max'
    if max < len:
        max = len
     
    return max
 
# Driver code to test above
arr = [ 2, 3, 4, 5, 1 ]
n = len(arr)
print("Length = ",longlenCircularSubarr(arr, n))
 
# This code is contributed by "Sharad_Bhardwaj".


C#
// C# implementation to find length
// of longest increasing circular subarray
using System;
 
public class GFG {
 
    // function to find length of longest
    // increasing circular subarray
    static int longlenCircularSubarr(int[] arr, int n)
    {
        // if there is only one element
        if (n == 1)
            return 1;
 
        // 'startLen' stores the length of the longest
        // increasing subarray which starts from
        // first element
        int startLen = 1, i;
        int len = 1, max = 0;
 
        // finding the length of the longest
        // increasing subarray starting from
        // first element
        for (i = 1; i < n; i++) {
            if (arr[i - 1] < arr[i])
                startLen++;
            else
                break;
        }
 
        if (max < startLen)
            max = startLen;
 
        // traverse the array index (i+1)
        for (int j = i + 1; j < n; j++) {
 
            // if current element if greater than previous
            // element, then this element helps in building
            // up the previous increasing subarray encountered
            // so far
            if (arr[j - 1] < arr[j])
                len++;
            else {
 
                // check if 'max' length is less than the length
                // of the current increasing subarray. If true,
                // then update 'max'
                if (max < len)
                    max = len;
 
                // reset 'len' to 1 as from this element
                // again the length of the new increasing
                // subarray is being calculated
                len = 1;
            }
        }
 
        // if true, then add length of the increasing
        // subarray ending at last element with the
        // length of the increasing subarray starting
        // from first element - This is done for
        // circular rotation
        if (arr[n - 1] < arr[0])
            len += startLen;
 
        // check if 'max' length is less than the length
        // of the current increasing subarray. If true,
        // then update 'max'
        if (max < len)
            max = len;
 
        return max;
    }
 
    // Driver program to test above
    static public void Main()
    {
        int[] arr = { 2, 3, 4, 5, 1 };
        int n = arr.Length;
        Console.WriteLine("Length = " +
                           longlenCircularSubarr(arr, n));
        // Code
    }
}
 
// This code is contributed by vt_m.


PHP


Javascript


输出:

Length = 5

时间复杂度: O(n)。