力扣(leetcode)每日一题 2012 数组美丽值求和

2012. 数组美丽值求和 - 力扣(LeetCode)

题目

给你一个下标从 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 就是比左边的都大,比右边的都小
需要两个辅助数组,分别记录
从左到右的最大。
从右边到左的最小。

解法一

java

public static int sumOfBeauties(int[] nums) {  
    if (nums.length < 2) {  
        return 0;  
    }  
    int length = nums.length;  
    int[] prefixMax = new int[length];  
    int[] subfixMin = new int[length];  
    prefixMax[0] = nums[0];  
    for (int i = nums.length - 1; i >= 0; i--) {  
        if (i == nums.length - 1) {  
            subfixMin[i] = nums[i];  
        } else {  
            subfixMin[i] = Math.min(subfixMin[i + 1], nums[i]);  
        }  
    }  
    int count = 0;  
    for (int i = 1; i < nums.length - 1; i++) {  
        prefixMax[i] = Math.max(prefixMax[i - 1], nums[i]);  
        if (nums[i] > prefixMax[i - 1] && nums[i] < subfixMin[i + 1]) {  
            count += 2;  
        } else if (nums[i] > nums[i - 1] && nums[i] < nums[i + 1]) {  
            count += 1;  
        }  
    }  
    return count;  
}

python


  
  
class Solution:  
    def sumOfBeauties(self, nums: List[int]) -> int:  
        n = len(nums)  
        suffix_min = [0] * n  
        prefix_max = [0] * n  
        suffix_min[n - 1] = nums[n - 1]  
        for i in range(n - 2, 1, -1):  
            suffix_min[i] = min(suffix_min[i + 1], nums[i])  
        count = 0  
        prefix_max[0] = nums[0]  
        for i in range(1, n - 1, 1):  
            if prefix_max[i - 1] < nums[i] < suffix_min[i + 1]:  
                count += 2  
            elif nums[i - 1] < nums[i] < nums[i + 1]:  
                count += 1  
            prefix_max[i] = max(prefix_max[i - 1], nums[i])  
        return count  
  
  
a = Solution().sumOfBeauties([1, 2, 3])  
print(a)

解法二 优化数组的空间

python


  
class Solution2:  
    def sumOfBeauties(self, nums: List[int]) -> int:  
        n = len(nums)  
        suffix_min = [0] * n  
        suffix_min[n - 1] = nums[n - 1]  
        for i in range(n - 2, 1, -1):  
            suffix_min[i] = min(suffix_min[i + 1], nums[i])  
        count = 0  
        prefix_max = nums[0]  
        for i in range(1, n - 1, 1):  
            if prefix_max < nums[i] < suffix_min[i + 1]:  
                count += 2  
            elif nums[i - 1] < nums[i] < nums[i + 1]:  
                count += 1  
            prefix_max = max(prefix_max, nums[i])  
        return count  
  
  
a = Solution2().sumOfBeauties([1, 2, 3])  
print(a)

总结

考点suffix/prefix arrays

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