2012. 数组美丽值求和 - 力扣(LeetCode)
题目
给你一个下标从 0 开始的整数数组 nums
。对于每个下标 i
(1 <= 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