0
点赞
收藏
分享

微信扫一扫

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

静守幸福 2022-01-17 阅读 56

题目链接
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;
    }
}
举报

相关推荐

0 条评论