题目链接
2012. 数组美丽值求和
大于左边所有数,并且小于右边所有数,即可+2
于是我们可以使用两个变量,分别保存当前遍历到的数左边的最大值,以及右边的最小值
(当前数只要大于左边的最大值就比左边所有数都大,小于右边的最小值就比右边所有数都小,即满足+2的条件)
具体实现:
正序遍历,判断当前数是否满足大于左边所有数(大于左边最大值)的条件
若满足就先记录为true,并更新左边的最大值 max,以便下一个数的判断使用
再倒序遍历,判断当前数是否满足小于右边所有数(小于右边最小值)的条件
若满足就表示当前数满足+2的条件,更新右边的最小值;
若不满足,需将数组中当前数的状态记为false,防止只满足左边条件的情况
class Solution {
public int sumOfBeauties(int[] nums) {
int tag=nums[0];
boolean[] b=new boolean[nums.length];
//第一次正向遍历,
for (int i = 1; i < nums.length-1; i++) {
if(nums[i]>tag){
//当值大于前面的最大值就存下来并把boolean设为true
tag=nums[i];
b[i]=true;
}
}
//对tag赋值为最右边
tag=nums[nums.length-1];
//逆向遍历
for (int i = nums.length-2; i>0; i--) {
if(nums[i]<tag){
//值小于于最小值就更新tag,否则boolean就为false
tag=nums[i];
}else {
b[i]=false;
}
}
//tag置为0
tag=0;
for (int i = 1; i < nums.length-1; i++) {
//按照boolean数组的true false进行遍历
if(b[i]){
tag+=2;
}else if(nums[i]<nums[i+1]&&nums[i]>nums[i-1]){
tag+=1;
}
}
return tag;
}
}