在给定条件下使用递增子序列和子数组的数组的最大分数
给定一个数组arr[] 。任务是找到i=[1, N-2]的arr[]可以达到的最大分数。评分条件如下。
- 如果arr[0…j] < arr[i] < arr[i+1…N-1] ,那么score = 2 。
- 如果arr[i-1] < arr[i] < arr[i+1]并且不满足先前的条件,则score = 1 。
- 如果条件都不成立,则score = 0 。
例子:
Input: arr[] = {1, 2, 3}
Output: 2
Explanation: The score of arr[1] equals 2, which is maximum possible.
Input: arr[] = {2, 4, 6, 4}
Output: 1
Explanation: For each index i in the range 1 <= i <= 2:
The score of nums[1] equals 1.
The score of nums[2] equals 0.
Hence 1 is the maximum possible score.
方法:这个问题可以通过使用 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)