题解 | #合唱队#

合唱队

https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4

package main

import (
    "fmt"
)

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

func removeLessElement(nums []int) int {
    size := len(nums)

    // left[i]: 表示在下标 i 左侧最长上升子序列的长度,包括 i
    // left[j]: 表示在下标 j 右侧最长下降子序列的长度,包括 j
    left := make([]int, size)
    right := make([]int, size)

    // 初始化
    for i:=0; i<size; i++ {
        left[i] = 1
        right[i] = 1
    }

    // 收集左侧元素
    for j:=1; j<size; j++ {
        for i:=0; i<j; i++ {
            if nums[i] < nums[j] {
                left[j] = max(left[j], left[i] + 1)
            }
        }
    }

    // 收集右侧元素
    for i:=size-2; i>=0; i-- {
        for j:=size-1; j>i; j-- {
            if nums[i] > nums[j] {
                right[i] = max(right[i], right[j] + 1)
            }
        }
    }

    // 枚举每个元素为中间元素
    var maxLength int
    for i:=0; i<size; i++ {
        maxLength = max(maxLength, left[i] + right[i] - 1)
    }

    return maxLength
}

func main() {
    var N int
    var nums []int

    fmt.Scan(&N)

    for i:=0; i<N; i++ {
        var num int
        fmt.Scan(&num)
        nums = append(nums, num)
    }

    fmt.Println(N - removeLessElement(nums))
}
// 本题输入为一行数字,所以采用 fmt.Scan(&n)
// 本题有点像 【接雨水】,先计算出左右两侧最高的柱子,然后累加每个柱子上可以存的水量
// ref: *************************************************

全部评论

相关推荐

11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务