leetcode2012_go_数组美丽值求和

题目

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

提示:3 <= nums.length <= 105

1 <= nums[i] <= 105

解题思路分析

1、前缀和;时间复杂度O(n),空间复杂度O(n)

leetcode2012_go_数组美丽值求和

func sumOfBeauties(nums []int) int {
   res := 0
   n := len(nums)
   arrA := make([]int, n)
   arrA[0] = nums[0]
   for i := 1; i < n; i++ {
      arrA[i] = max(nums[i], arrA[i-1])
   }
   arrB := make([]int, n)
   arrB[n-1] = nums[n-1]
   for i := n - 2; i >= 0; i-- {
      arrB[i] = min(nums[i], arrB[i+1])
   }
   for i := 1; i <= n-2; i++ {
      if arrA[i-1] < nums[i] && nums[i] < arrB[i+1] {
         res = res + 2
      } else if nums[i-1] < nums[i] && nums[i] < nums[i+1] {
         res = res + 1
      }
   }
   return res
}

func min(a, b int) int {
   if a > b {
      return b
   }
   return a
}

func max(a, b int) int {
   if a > b {
      return a
   }
   return b
}

总结

Medium题目,前缀和问题

展开阅读全文

页面更新:2024-05-18

标签:数组   下标   前缀   整数   题目   美丽   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top