📜  在给定条件下使用递增子序列和子数组的数组的最大分数

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

在给定条件下使用递增子序列和子数组的数组的最大分数

给定一个数组arr[] 。任务是找到i=[1, N-2]arr[]可以达到的最大分数。评分条件如下。

  1. 如果arr[0…j] < arr[i] < arr[i+1…N-1] ,那么score = 2
  2. 如果arr[i-1] < arr[i] < arr[i+1]并且不满足先前的条件,则score = 1
  3. 如果条件都不成立,则score = 0

例子:

方法:这个问题可以通过使用 Prefix Max 和 Suffix Min 来解决。请按照以下步骤解决给定的问题。

  • 对于元素得分为2 ,它应该大于其左侧的每个元素并小于其右侧的每个元素。
  • 所以预计算找到每个数组元素的前缀最大值后缀最小值
  • 现在检查i处的每个数组arr[]元素:
    • 如果它在i-1处大于前缀 max 并且在i+1处小于后缀 min ,则分数将为2
    • 否则,如果它大于arr[i-1]且小于arr[i+1] ,则得分将为1
    • 否则得分将为0
  • 总结所有分数并将其作为最终答案返回。

下面是上述方法的实现。

C++
// C++ program for above approach
#include 
using namespace std;
 
// Function to find maximum score
int maxScore(vector& nums)
{
 
    // Size of array
    int n = nums.size(), i;
    int ans = 0;
 
    // Prefix max
    vector pre(n, 0);
 
    // Suffix min
    vector suf(n, 0);
 
    pre[0] = nums[0];
 
    for (i = 1; i < n; i++)
        pre[i] = max(pre[i - 1], nums[i]);
 
    suf[n - 1] = nums[n - 1];
    for (i = n - 2; i >= 0; i--)
        suf[i] = min(suf[i + 1], nums[i]);
 
    for (i = 1; i < n - 1; i++) {
        if (nums[i] > pre[i - 1]
            && nums[i] < suf[i + 1])
            ans += 2;
        else if (nums[i] > nums[i - 1]
                 && nums[i] < nums[i + 1])
            ans += 1;
    }
 
    return ans;
}
 
// Driver Code
int main()
{
    int N = 3;
 
    vector arr = { 1, 2, 3 };
 
    // Function Call
    cout << maxScore(arr);
 
    return 0;
}


Java
// Java program for above approach
import java.util.*;
public class GFG
{
   
    // Function to find maximum score
    static int maxScore(ArrayList nums)
    {
 
        // Size of array
        int n = nums.size(), i = 0;
 
        int ans = 0;
 
        // Prefix max
        int[] pre = new int[n];
 
        // Suffix min
        int[] suf = new int[n];
 
        pre[0] = (int)nums.get(0);
 
        for (i = 1; i < n; i++)
            pre[i] = Math.max(pre[i - 1], (int)nums.get(i));
 
        suf[n - 1] = (int)nums.get(n - 1);
        for (i = n - 2; i >= 0; i--)
            suf[i] = Math.min(suf[i + 1], (int)nums.get(i));
 
        for (i = 1; i < n - 1; i++) {
            if ((int)nums.get(i) > pre[i - 1]
                && (int)nums.get(i) < suf[i + 1])
                ans += 2;
            else if ((int)nums.get(i) > (int)nums.get(i - 1)
                     && (int)nums.get(i) < (int)nums.get(i + 1))
                ans += 1;
        }
 
        return ans;
    }
 
    // Driver Code
    public static void main(String args[])
    {
 
        ArrayList arr = new ArrayList();
         
        arr.add(1);
        arr.add(2);
        arr.add(3);
 
        // Function Call
        System.out.println(maxScore(arr));
    }
}
 
// This code is contributed by Samim Hossain Mondal.


Python3
# python program for above approach
 
# Function to find maximum score
def maxScore(nums):
 
    # Size of array
    n = len(nums)
    ans = 0
 
    # Prefix max
    pre = [0 for _ in range(n)]
 
    # Suffix min
    suf = [0 for _ in range(n)]
 
    pre[0] = nums[0]
 
    for i in range(1, n):
        pre[i] = max(pre[i - 1], nums[i])
 
    suf[n - 1] = nums[n - 1]
    for i in range(n-2, -1, -1):
        suf[i] = min(suf[i + 1], nums[i])
 
    for i in range(1, n-1):
        if (nums[i] > pre[i - 1] and nums[i] < suf[i + 1]):
            ans += 2
        elif (nums[i] > nums[i - 1] and nums[i] < nums[i + 1]):
            ans += 1
 
    return ans
 
# Driver Code
if __name__ == "__main__":
    N = 3
    arr = [1, 2, 3]
 
    # Function Call
    print(maxScore(arr))
 
# This code is contributed by rakeshsahni


C#
// C# program for above approach
using System;
using System.Collections.Generic;
class GFG
{
   
    // Function to find maximum score
    static int maxScore(List nums)
    {
 
        // Size of array
        int n = nums.Count, i = 0;
 
        int ans = 0;
 
        // Prefix max
        int[] pre = new int[n];
 
        // Suffix min
        int[] suf = new int[n];
 
        pre[0] = nums[0];
 
        for (i = 1; i < n; i++)
            pre[i] = Math.Max(pre[i - 1], nums[i]);
 
        suf[n - 1] = nums[n - 1];
        for (i = n - 2; i >= 0; i--)
            suf[i] = Math.Min(suf[i + 1], nums[i]);
 
        for (i = 1; i < n - 1; i++) {
            if (nums[i] > pre[i - 1]
                && nums[i] < suf[i + 1])
                ans += 2;
            else if (nums[i] > nums[i - 1]
                     && nums[i] < nums[i + 1])
                ans += 1;
        }
 
        return ans;
    }
 
    // Driver Code
    public static void Main()
    {
 
        List arr = new List() { 1, 2, 3 };
 
        // Function Call
        Console.WriteLine(maxScore(arr));
    }
}
 
// This code is contributed by ukasp.


Javascript


输出
2

时间复杂度: O(N)
辅助空间: O(N)