Welcome to Subscribe On Youtube

3637. Trionic Array I

Description

You are given an integer array nums of length n.

An array is trionic if there exist indices 0 < p < q < n − 1 such that:

  • nums[0...p] is strictly increasing,
  • nums[p...q] is strictly decreasing,
  • nums[q...n − 1] is strictly increasing.

Return true if nums is trionic, otherwise return false.

 

Example 1:

Input: nums = [1,3,5,4,2,6]

Output: true

Explanation:

Pick p = 2, q = 4:

  • nums[0...2] = [1, 3, 5] is strictly increasing (1 < 3 < 5).
  • nums[2...4] = [5, 4, 2] is strictly decreasing (5 > 4 > 2).
  • nums[4...5] = [2, 6] is strictly increasing (2 < 6).

Example 2:

Input: nums = [2,1,3]

Output: false

Explanation:

There is no way to pick p and q to form the required three segments.

 

Constraints:

  • 3 <= n <= 100
  • -1000 <= nums[i] <= 1000

Solutions

Solution 1: Single Pass

We first define a pointer $p$, initially $p = 0$, pointing to the first element of the array. We move $p$ to the right until we find the first element that doesn’t satisfy strict increasing order, i.e., $nums[p] \geq nums[p + 1]$. If $p = 0$ at this point, it means the first part of the array doesn’t have a strictly increasing section, so we return $\text{false}$ directly.

Next, we define another pointer $q$, initially $q = p$, pointing to the first element of the second part of the array. We move $q$ to the right until we find the first element that doesn’t satisfy strict decreasing order, i.e., $nums[q] \leq nums[q + 1]$. If $q = p$ or $q = n - 1$ at this point, it means the second part of the array doesn’t have a strictly decreasing section or there’s no third part, so we return $\text{false}$ directly.

If all the above conditions are satisfied, it means the array is trionic, and we return $\text{true}$.

The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$, using only constant extra space.

  • class Solution {
        public boolean isTrionic(int[] nums) {
            int n = nums.length;
            int p = 0;
            while (p < n - 2 && nums[p] < nums[p + 1]) {
                p++;
            }
            if (p == 0) {
                return false;
            }
            int q = p;
            while (q < n - 1 && nums[q] > nums[q + 1]) {
                q++;
            }
            if (q == p || q == n - 1) {
                return false;
            }
            while (q < n - 1 && nums[q] < nums[q + 1]) {
                q++;
            }
            return q == n - 1;
        }
    }
    
    
  • class Solution {
    public:
        bool isTrionic(vector<int>& nums) {
            int n = nums.size();
            int p = 0;
            while (p < n - 2 && nums[p] < nums[p + 1]) {
                p++;
            }
            if (p == 0) {
                return false;
            }
            int q = p;
            while (q < n - 1 && nums[q] > nums[q + 1]) {
                q++;
            }
            if (q == p || q == n - 1) {
                return false;
            }
            while (q < n - 1 && nums[q] < nums[q + 1]) {
                q++;
            }
            return q == n - 1;
        }
    };
    
  • class Solution:
        def isTrionic(self, nums: List[int]) -> bool:
            n = len(nums)
            p = 0
            while p < n - 2 and nums[p] < nums[p + 1]:
                p += 1
            if p == 0:
                return False
            q = p
            while q < n - 1 and nums[q] > nums[q + 1]:
                q += 1
            if q == p or q == n - 1:
                return False
            while q < n - 1 and nums[q] < nums[q + 1]:
                q += 1
            return q == n - 1
    
    
  • func isTrionic(nums []int) bool {
    	n := len(nums)
    	p := 0
    	for p < n-2 && nums[p] < nums[p+1] {
    		p++
    	}
    	if p == 0 {
    		return false
    	}
    	q := p
    	for q < n-1 && nums[q] > nums[q+1] {
    		q++
    	}
    	if q == p || q == n-1 {
    		return false
    	}
    	for q < n-1 && nums[q] < nums[q+1] {
    		q++
    	}
    	return q == n-1
    }
    
    
  • function isTrionic(nums: number[]): boolean {
        const n = nums.length;
        let p = 0;
        while (p < n - 2 && nums[p] < nums[p + 1]) {
            p++;
        }
        if (p === 0) {
            return false;
        }
        let q = p;
        while (q < n - 1 && nums[q] > nums[q + 1]) {
            q++;
        }
        if (q === p || q === n - 1) {
            return false;
        }
        while (q < n - 1 && nums[q] < nums[q + 1]) {
            q++;
        }
        return q === n - 1;
    }
    
    

All Problems

All Solutions