3912. 数组中的有效元素

May 3, 2026 · View on GitHub

English Version

题目描述

给你一个整数数组 nums

如果元素 nums[i] 满足以下 至少一个 条件,则认为它是 有效 元素:

  •  严格大于 其左侧的所有元素。
  •  严格大于 其右侧的所有元素。

第一个元素和最后一个元素始终有效。

返回所有有效元素组成的数组,顺序与它们在 nums 中出现的顺序相同。

 

示例 1:

输入: nums = [1,2,4,2,3,2]

输出: [1,2,4,3,2]

解释:

  • nums[0]nums[5] 始终有效。
  • nums[1]nums[2] 都严格大于其左侧的所有元素。
  • nums[4] 严格大于其右侧的所有元素。
  • 因此,答案为 [1, 2, 4, 3, 2]

示例 2:

输入: nums = [5,5,5,5]

输出: [5,5]

解释:

  • 第一个元素和最后一个元素始终有效。
  • 其他元素既不严格大于其左侧的所有元素,也不严格大于其右侧的所有元素。
  • 因此,答案为 [5, 5]

示例 3:

输入: nums = [1]

输出: [1]

解释:

由于数组中只有一个元素,它始终有效。因此,答案为 [1]

 

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100

解法

方法一:预处理数组

我们可以预处理数组,计算出每个元素右侧的最大值,记录在数组 right\textit{right} 中。

然后,我们从左到右遍历数组,使用一个变量 left\textit{left} 来记录当前元素左侧的最大值。对于每个元素,如果它满足以下任一条件,则将其加入答案中:

  • 它严格大于 left\textit{left}
  • 它是数组的最后一个元素。
  • 它严格大于 right[i+1]\textit{right}[i + 1]

在遍历过程中,我们不断更新 left\textit{left} 的值。

遍历结束后,返回答案即可。

时间复杂度 O(n)O(n),空间复杂度 O(n)O(n)。其中 nn 是数组 nums\textit{nums} 的长度。

Python3

class Solution:
    def findValidElements(self, nums: list[int]) -> list[int]:
        n = len(nums)
        right = [nums[-1]] * n
        for i in range(n - 2, -1, -1):
            right[i] = max(right[i + 1], nums[i])
        left = 0
        ans = []
        for i, x in enumerate(nums):
            if x > left or i == n - 1 or x > right[i + 1]:
                ans.append(x)
            left = max(left, x)
        return ans

Java

class Solution {
    public List<Integer> findValidElements(int[] nums) {
        int n = nums.length;
        int[] right = new int[n];
        right[n - 1] = nums[n - 1];
        for (int i = n - 2; i >= 0; i--) {
            right[i] = Math.max(right[i + 1], nums[i]);
        }
        int left = 0;
        List<Integer> ans = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int x = nums[i];
            if (x > left || i == n - 1 || x > right[i + 1]) {
                ans.add(x);
            }
            left = Math.max(left, x);
        }
        return ans;
    }
}

C++

class Solution {
public:
    vector<int> findValidElements(vector<int>& nums) {
        int n = nums.size();
        vector<int> right(n);
        right[n - 1] = nums[n - 1];
        for (int i = n - 2; i >= 0; i--) {
            right[i] = max(right[i + 1], nums[i]);
        }
        int left = 0;
        vector<int> ans;
        for (int i = 0; i < n; i++) {
            int x = nums[i];
            if (x > left || i == n - 1 || x > right[i + 1]) {
                ans.push_back(x);
            }
            left = max(left, x);
        }
        return ans;
    }
};

Go

func findValidElements(nums []int) []int {
	n := len(nums)
	right := make([]int, n)
	right[n-1] = nums[n-1]
	for i := n - 2; i >= 0; i-- {
		right[i] = max(right[i+1], nums[i])
	}
	left := 0
	ans := []int{}
	for i, x := range nums {
		if x > left || i == n-1 || x > right[i+1] {
			ans = append(ans, x)
		}
		left = max(left, x)
	}
	return ans
}

TypeScript

function findValidElements(nums: number[]): number[] {
    const n = nums.length;
    const right = new Array(n);
    right[n - 1] = nums[n - 1];
    for (let i = n - 2; i >= 0; i--) {
        right[i] = Math.max(right[i + 1], nums[i]);
    }
    let left = 0;
    const ans: number[] = [];
    for (let i = 0; i < n; i++) {
        const x = nums[i];
        if (x > left || i === n - 1 || x > right[i + 1]) {
            ans.push(x);
        }
        left = Math.max(left, x);
    }
    return ans;
}