📌  相关文章
📜  从每个索引开始的最长交替(正负)子数组

📅  最后修改于: 2021-04-29 09:46:10             🧑  作者: Mango

如果子数组中的任何两个连续数字具有相反的符号(即,其中一个应为负,而另一个应为正),则称为子数组。
给定一个由n个整数组成的数组。对于每个索引i,我们需要找到长度最长的交替子数组(从i开始)。
例子:

Input : a[] = {1, -5, 1, -5}
Output : For index 0, {1, -5, 1, -5} = 4
             index 1, {-5, 1, -5} = 3
             index 2, {1, -5} = 2
             index 3, {-5} = 1.
      
Input :a[] = {-5, -1, -1, 2, -2, -3}
Output : index 0 = 1,
         index 1 = 1,
         index 2 = 3,
         index 3 = 2,
         index 4 = 1,
         index 5 = 1,

幼稚的方法是使用两个循环,其中我们从每个索引i(0到n-1)开始遍历整个数组,并计算出交替子数组的长度。
时间复杂度:O(n 2 )。
高效方法:
观察到,当a [i]a [i + 1]具有相反的符号时, count [i]将比count [i + 1]1 。否则,当它们具有相同的符号计数时,[i]将为1。
我们在这里使用动态编程。

C++
// CPP program to find longest alternating
// subarray starting from every index.
#include 
using namespace std;
 
void longestAlternating(int arr[], int n)
{
    int count[n];
 
    // Fill count[] from end.
    count[n - 1] = 1;
    for (int i = n - 2; i >= 0; i--) {
        if (arr[i] * arr[i + 1] < 0)
            count[i] = count[i + 1] + 1;
        else
            count[i] = 1;
    }
 
    // Print result
    for (int i = 0; i < n; i++)
        cout << count[i] << " ";
}
 
// Driver code
int main()
{
    int a[] = { -5, -1, -1, 2, -2, -3 };
    int n = sizeof(a) / sizeof(a[0]);
    longestAlternating(a, n);
    return 0;
}


Java
// Java program to find longest alternating
// subarray starting from every index.
import java.util.*;
 
class Longest{
     
    public static void longestAlternating(int arr[],
                                             int n)
    {
        int[] count = new int[n];
 
        // Fill count[] from end.
        count[n - 1] = 1;
        for (int i = n - 2; i >= 0; i--) {
            if (arr[i] * arr[i + 1] < 0)
                count[i] = count[i + 1] + 1;
            else
                count[i] = 1;
        }
 
        // Print result
        for (int i = 0; i < n; i++)
            System.out.print(count[i] + " ");
    }
     
    // driver program
    public static void main(String[] args)
    {
        int a[] = { -5, -1, -1, 2, -2, -3 };
        int n = 6;
        longestAlternating(a, n);
    }
}
 
// This code is contributed by rishabh_jain


Python3
# Python3 program to find longest alternating
# subarray starting from every index.
 
def longestAlternating(arr, n) :
    count = [None] * n
 
    # Fill count[] from end.
    count[n - 1] = 1
    i = n - 2
     
    while i >= 0 :
        if (arr[i] * arr[i + 1] < 0) :
            count[i] = count[i + 1] + 1
        else :
            count[i] = 1;
        i = i - 1
 
    i = 0
     
    # Print result
    while i < n :
        print (count[i], end = " ")
        i = i + 1
 
# Driver Code
a = [ -5, -1, -1, 2, -2, -3 ]
n = len(a)
longestAlternating(a, n);
 
 
# This code is contributed by rishabh_jain


C#
//C# program to find longest alternating
// subarray starting from every index.
using System;
 
class Longest
{
     
    public static void longestAlternating(int []arr,
                                            int n)
    {
        int[] count = new int[n];
 
        // Fill count[] from end.
        count[n - 1] = 1;
        for (int i = n - 2; i >= 0; i--)
        {
            if (arr[i] * arr[i + 1] < 0)
                count[i] = count[i + 1] + 1;
            else
                count[i] = 1;
        }
 
        // Print result
        for (int i = 0; i < n; i++)
            Console.Write(count[i] + " ");
    }
     
    // Driver program
    public static void Main()
    {
        int []a = { -5, -1, -1, 2, -2, -3 };
        int n = 6;
        longestAlternating(a, n);
    }
}
 
// This code is contributed by vt_m


PHP
= 0; $i--)
    {
        if ($arr[$i] * $arr[$i + 1] < 0)
            $count[$i] = $count[$i + 1] + 1;
        else
            $count[$i] = 1;
    }
 
    // Print result
    for ( $i = 0; $i < $n; $i++)
        echo $count[$i] , " ";
}
 
    // Driver code
    $a = array( -5, -1, -1, 2, -2, -3 );
    $n =count($a);
    longestAlternating($a, $n);
 
// This code is contributed by anuj_67.
?>


Javascript


输出:

1 1 3 2 1 1