Skip to content

Perfect Peak of Array

Problem Description

Given an integer array A of size N.

You need to check that whether there exist a element which is strictly greater than all the elements on left of it and strictly smaller than all the elements on right of it.

If it exists return 1 else return 0.

NOTE:

  • Do not consider the corner elements i.e A[0] and A[N-1] as the answer.

Problem Constraints

3 <= N <= 10^5
1 <= A[i] <= 10^9

Input Format

First and only argument is an integer array A containing N integers.

Output Format

Return 1 if there exist a element that is strictly greater than all the elements on left of it and strictly  smaller than all the elements on right of it else return 0.

Example Input

Input 1:
 A = [5, 1, 4, 3, 6, 8, 10, 7, 9]

Input 2:
 A = [5, 1, 4, 4]

Example Output

Output 1:
 1

Output 2:
 0

Example Explanation

Explanation 1:
 A[4] = 6 is the element we are looking for.
 All elements on left of A[4] are smaller than it and all elements on right are greater.

Explanation 2:
 No such element exits.

Solution

swift
import Foundation

class Solution {
	func perfectPeak(_ A: inout [Int]) -> Int {
        var gr = [Int]()
        // var sm = [Int]()
        
        var max = Int.min
        for (i,v) in A.enumerated() {
            if v > max {
                gr.append(i)
                max = v
            }
        }
        
        var min = A.last!
        for i in (1..<(A.count-1)).reversed() {
            if A[i] < min {
                min = A[i]
                while gr.count > 0 && gr.last! > i {
                    gr.removeLast()
                }
                if gr.count == 0 {
                    return 0
                }
                
                if gr.last! == i {
                    return 1
                }
            }
        }
        return 0
        // if gr.count < 3  || sm.count < 3{
        //     return 0
        // }
        
        // var i = 1
        // var j = 1
        // while i < (gr.count-1) && j < (sm.count - 1) {
        //     let g = gr[i]
        //     let s = sm[j]
        //     if g > s {
        //         j += 1
        //     } else if g < s{
        //         i += 1
        //     } else  {
        //         return 1
        //     }
        // }
        
        // return 0
        
	}
}

References