268.数组美丽值求和
2012. 数组美丽值求和 - 力扣(LeetCode)
class Solution {
public int sumOfBeauties(int[] nums) {
int res=0;
int[] everyMax=new int[nums.length];//每个数组前面最大的数字
int[] everyMin=new int[nums.length];//每个数组后面最小的数字
everyMin[nums.length-1]=Integer.MAX_VALUE;
for(int i=1;i<nums.length;i++){
everyMax[i]=Math.max(nums[i-1],everyMax[i-1]);
}
for(int i=nums.length-2;i>=0;i--){
everyMin[i]=Math.min(nums[i+1],everyMin[i+1]);
}
for(int i=1;i<nums.length-1;i++){
if(nums[i]>everyMax[i]&&nums[i]<everyMin[i]){
res+=2;
}
else if(i>0&&i<nums.length-1&&nums[i - 1]<nums[i]&&nums[i]<nums[i + 1]){
res++;
}
}
return res;
}
}
class Solution(object):
def sumOfBeauties(self, nums):
res=0
n=len(nums)
everyMax=n*[0]#每个数组前面最大的数字
everyMin=n*[0]#每个数组后面最小的数字
everyMin[-1]=sys.maxint
for i in range(1, n):
everyMax[i] = max(nums[i - 1], everyMax[i - 1])
for i in range(n - 2, -1, -1):
everyMin[i] = min(nums[i + 1], everyMin[i + 1])
for i in range(1, n - 1):
if nums[i] > everyMax[i] and nums[i] < everyMin[i]:
res += 2
elif i > 0 and i < n - 1 and nums[i - 1] < nums[i] and nums[i] < nums[i + 1]:
res += 1
return res
为了高效地计算每个元素的美丽值,我们可以使用两个辅助数组:everyMax
和 everyMin
。everyMax[i]
表示数组 nums
中从第0个元素到第 i-1
个元素的最大值。everyMin[i]
表示数组 nums
中从第 i+1
个元素到最后一个元素的最小值。
初始化辅助数组:everyMax
数组用于存储每个位置前面的最大值。我们从左到右遍历数组,更新 everyMax
数组。everyMin
数组用于存储每个位置后面的最小值。我们从右到左遍历数组,更新 everyMin
数组。计算美丽值:对于数组中的每个元素 nums[i]
(不包括第一个和最后一个元素),我们检查它是否大于 everyMax[i]
并且小于 everyMin[i]
。如果满足条件,美丽值为2。如果不满足上述条件,但 nums[i]
比它前面的元素大并且比它后面的元素小,美丽值为1。否则,美丽值为0。累加美丽值:我们将每个元素的美丽值累加到结果 res
中,最后返回 res
。通过这种方法,我们可以在O(n)的时间复杂度内计算出数组中所有元素的美丽值之和。