【LeetCode】数组美丽值求和Java题解

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

题目描述

给你一个下标从 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:

输入:nums = [2,4,6,4]
输出:1
解释:对于每个符合范围 1 <= i <= 2 的下标 i :
- nums[1] 的美丽值等于 1
- nums[2] 的美丽值等于 0
示例 3:

输入:nums = [3,2,1]
输出:0
解释:对于每个符合范围 1 <= i <= 1 的下标 i :
- nums[1] 的美丽值等于 0

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sum-of-beauty-in-the-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 今天的算法题目是数组题目,题目自定义了一种美丽值的算法,我们需要求出 nums[i] 的美丽值,累加求和之后就是结果。
  • 计算美丽值的规则比较清晰,我们可以直接按照规则,实现朴素算法。朴素算法有较多的重复计算,时间复杂度比较高,不能通过全部用例。
  • 我们需要减少重复计算,通过朴素算法,更好的理解了题目含义。中间的数满足大于左边所有数,并且小于右边所有数,即可+2。可以使用两个变量分别记录左边的最大值和右边的最小值。然后设置 boolean[] temp 数组,判断当前的 nums[i] 与左边最大数,右边最小数的关系,同时动态更新最值问题。当不满足 +2 的条件时候,在判断时候是否满足 +1 的条件。具体代码实现如下,供参考。

通过代码

class Solution {
    public int sumOfBeauties(int[] nums) {
        int ans = 0;
        int n = nums.length;
        int leftMax = nums[0];
        int rightMin = nums[n - 1];
        boolean[] temp = new boolean[n];

        for (int i = 1; i < n - 1; i++) {
            if (nums[i] > leftMax) {
                temp[i] = true;
                leftMax = nums[i];
            }
        }

        for (int i = n - 2; i >= 1; i--) {
            if (nums[i] < rightMin) {
                rightMin = nums[i];
            } else {
                temp[i] = false;
            }
        }
        for (int i = 1; i <= n - 2; ++i) {
            if (temp[i]) {
                ans += 2;
            } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
                ans += 1;
            }
        }
        return ans;
    }
}

复制代码

总结

  • 上述算法的时间复杂度是O(n),空间复杂度是O(n)
  • 坚持算法每日一题,加油!

猜你喜欢

转载自juejin.im/post/7127838693578145805