力扣(leetcode)每日一题 2012 数组美丽值求和
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