leetcode 2012. 数组美丽值求和(C++、java、python)

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

  • 2,对于所有 0 <= j < i 且 i < 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

C++

class Solution {
public:
    int sumOfBeauties(vector<int>& nums) {
        int n=nums.size();
        vector<int> left(n,0);
        vector<int> right(n,0);
        int max_val=nums[0];
        int min_val=nums[n-1];
        for(int i=1;i<n-1;i++) {
            if(nums[i]>max_val) {
                left[i]=1;
            }
            max_val=max(max_val,nums[i]);
        }
        for(int i=n-2;i>0;i--) {
            if(nums[i]<min_val) {
                right[i]=1;
            }
            min_val=min(min_val,nums[i]);
        }
        int res=0;
        for(int i=1;i<n-1;i++) {
            if(left[i]==1 && right[i]==1) {
                res+=2;
            } else if(nums[i-1]<nums[i] && nums[i]<nums[i+1]) {
                res+=1;
            }
        }
        return res;
    }
};

java

class Solution {
    public int sumOfBeauties(int[] nums) {
        int n = nums.length;
        int[] left = new int[n];
        int[] right = new int[n];
        int max_val = nums[0];
        for (int i = 1; i < n - 1; i++) {
            if (nums[i] > max_val) {
                left[i] = 1;
            }
            max_val = Math.max(max_val, nums[i]);
        }
        int min_val = nums[n - 1];
        for (int i = n - 2; i > 0; i--) {
            if (nums[i] < min_val) {
                right[i] = 1;
            }
            min_val = Math.min(min_val, nums[i]);
        }
        int res = 0;
        for (int i = 1; i < n - 1; i++) {
            if (left[i] == 1 && right[i] == 1) {
                res += 2;
            } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
                res += 1;
            }
        }
        return res;
    }
}

python

class Solution:
    def sumOfBeauties(self, nums: List[int]) -> int:
        n = len(nums)
        left = [0] * n
        right = [0] * n
        max_val = nums[0]
        for i in range(1, n - 1):
            if nums[i] > max_val:
                left[i] = 1
            max_val = max(max_val, nums[i])
        min_val = nums[n - 1]
        for i in range(n - 2, 0, -1):
            if nums[i] < min_val:
                right[i] = 1
            min_val = min(min_val, nums[i])
        res = 0
        for i in range(1, n - 1):
            if left[i] == 1 and right[i] == 1:
                res += 2
            elif nums[i - 1] < nums[i] and nums[i] < nums[i + 1]:
                res += 1
        return res

猜你喜欢

转载自blog.csdn.net/qq_27060423/article/details/120445692