算法每日一题-数组美丽值求和

题目链接
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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alie鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值