Open In App

Maximum score of Array using increasing subsequence and subarray with given conditions

Last Updated : 19 Dec, 2021
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array arr[]. The task is to find the maximum score that can be achieved from arr[] for i=[1, N-2]. The conditions for scoring are given below.

  1. If arr[0…j] < arr[i] < arr[i+1…N-1], then score = 2.
  2. If arr[i-1] < arr[i] < arr[i+1] and previous condition is not satisfied, then score = 1.
  3. If none of the conditions holds, then score = 0.

Examples:

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. 

 

Approach: This problem can be solved by using Prefix Max and Suffix Min. Follow the steps below to solve the given problem. 

  • For an element score to be 2, it should be greater than every element on its left and smaller than every element on its right.
  • So Precompute to find prefix max and suffix min for each array element.
  • Now check for each array arr[] element at i:
    • If it is greater than prefix max at i-1, and smaller than suffix min at i+1, the score will be 2.
    • else if it is greater than arr[i-1] and smaller than arr[i+1], score will be 1.
    • else score will be 0.
  • Sum up all the scores and return that as the final answer.

Below is the implementation of the above approach. 

C++




// C++ program for above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find maximum score
int maxScore(vector<int>& nums)
{
 
    // Size of array
    int n = nums.size(), i;
    int ans = 0;
 
    // Prefix max
    vector<int> pre(n, 0);
 
    // Suffix min
    vector<int> 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<int> 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<Integer> 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<Integer> arr = new ArrayList<Integer>();
         
        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<int> 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<int> arr = new List<int>() { 1, 2, 3 };
 
        // Function Call
        Console.WriteLine(maxScore(arr));
    }
}
 
// This code is contributed by ukasp.


Javascript




<script>
      // JavaScript code for the above approach
 
      // Function to find maximum score
      function maxScore(nums) {
 
          // Size of array
          let n = nums.length, i;
          let ans = 0;
 
          // Prefix max
          let pre = new Array(n).fill(0)
 
          // Suffix min
          let suf = new Array(n).fill(0);
 
          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
 
      let N = 3;
 
      let arr = [1, 2, 3];
 
      // Function Call
      document.write(maxScore(arr));
 
// This code is contributed by Potta Lokesh
  </script>


Output

2

Time Complexity: O(N) 
Auxiliary Space: O(N)



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads