Featured image of post 978. 最长湍流子数组

978. 最长湍流子数组

题目描述

给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度

如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。

更正式地来说,当 arr 的子数组 A[i], A[i+1], ..., A[j] 满足仅满足下列条件时,我们称其为_湍流子数组_:

  • 若 i <= k < j :
    • k 为奇数时, A[k] > A[k+1],且
    • k 为偶数时,A[k] < A[k+1]
  • 若 i <= k < j :
    • k 为偶数时,A[k] > A[k+1] ,且
    • k 为奇数时, A[k] < A[k+1]

示例 1:

  • 输入:arr = [9,4,2,10,7,8,8,1,9]
  • 输出:5
  • 解释:arr[1] > arr[2] < arr[3] > arr[4] < arr[5]

示例 2:

  • 输入:arr = [4,8,12,16]
  • 输出:2

示例 3:

  • 输入:arr = [100]
  • 输出:1

提示:

  • 1 <= arr.length <= 4 * 104
  • 0 <= arr[i] <= 109

解法一:动态规划 + 前缀和

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func sumOfPower(nums []int) int {
    const MOD = int(1e9 + 7)
    n := len(nums)
    sort.Ints(nums)
    // dp[i] 表示以 nums[i] 结尾的子序列的最小值之和
    ans, dp, prefixSum := 0, 0, 0
    for i := 0; i < n; i++ {
        dp = (nums[i] + prefixSum) % MOD
        ans = (ans + nums[i]*nums[i]%MOD*dp%MOD) % MOD
        prefixSum += dp
    }
    return ans
}
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计