LeetCode每日一题-2025.3.11 数组美丽值求和

难度:中等
给你一个下标从 0 开始的整数数组 nums 。对于每个下标 i(1 <= i <= nums.length - 2),nums[i] 的 美丽值 等于:

2,对于所有 0 <= j < ii < k <= nums.length - 1 ,满足 nums[j] < nums[i] < nums[k]
1,如果满足 nums[i - 1] < nums[i] < nums[i + 1] ,且不满足前面的条件
0,如果上述条件全部不满足
返回符合 1 <= i <= nums.length - 2 的所有 nums[i] 的 美丽值的总和 。

示例 1:

输入:nums = [1,2,3]
输出:2
解释:对于每个符合范围 1 <= i <= 1 的下标 i :

  • nums[1] 的美丽值等于 2

示例 2:

输入:nums = [2,4,6,4]
输出:1
解释:对于每个符合范围 1 <= i <= 2 的下标 i :

  • nums[1] 的美丽值等于 1
  • nums[2] 的美丽值等于 0

示例 3:

输入:nums = [3,2,1]
输出:0
解释:对于每个符合范围 1 <= i <= 1 的下标 i :

  • nums[1] 的美丽值等于 0

提示:

3 <= nums.length <= 105
1 <= nums[i] <= 105

思路:

  1. 定义两个辅助数组pre、ord用于存储nums[i]的最大前缀和最小后缀
  2. 遍历nums数组判断是否符合题设条件
class Solution {
    public int sumOfBeauties(int[] nums) {
        int res = 0;
        int[] pre = new int[nums.length]; // 最大前缀数组
        int[] ord = new int[nums.length]; // 最小后缀数组
        int max = nums[0];
        // 如果当前元素最大,则pre[i]更新为前面最大的一个
        for(int i = 0;i<pre.length;i++){
            if(max > nums[i]){
                pre[i] = max;
            }else{
                pre[i] = max;
                max = nums[i];
            }
        }
        // 如果当前元素最小,则ord[i]更新为后面最小的一个
        int min = nums[nums.length-1];
        for(int i = nums.length-1;i>=0;i--){
            if(min < nums[i]){
                ord[i] = min;
            }else{
                ord[i] = min;
                min = nums[i];
            }
        }
        
        for(int i = 1;i<=nums.length-2;i++){
            // 判断 “对于所有 0 <= j < i 且 i < k <= nums.length - 1 ,满足 nums[j] < nums[i] < nums[k]”
            if(nums[i]>pre[i] && nums[i] < ord[i]){
                res+=2;
                continue; // 满足则直接进行下一次的判断,因为后续条件要求不满足此条件
            }
            // 判断 “如果满足 nums[i - 1] < nums[i] < nums[i + 1] ,且不满足前面的条件”
            if(nums[i-1] < nums[i] && nums[i+1] > nums[i]){
                res++;
            }
        }

        return res;
        
    }
}

你可能感兴趣的:(数据结构与算法,leetcode,算法,数据结构)