题解 | #合唱队#

合唱队

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: *************************************************

全部评论

相关推荐

ZywOo_求职版:谁问你了....
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
感觉他们一点都不了解现在这个社会就业有多难,已经在牛客刷到好多篇&nbsp;延毕的帖子了,延毕就会导致已经找好的工作就没了,还得重新再找,学校和老师们是怎么想的呢????看到学生丢失工作会开心吗&nbsp;就业数据都在造假,真实的就业困难不去解决&nbsp;一个个真是好样的
从明天开始狠狠卷JV...:学生看到的是导师不放实习导致offer黄了。 导师看到的是招进来的学生吃自己补助和自己的招生名额,却没给自己升迁带来任何帮助,还要跑路。 根本利益的不一致,最主要留校的导师大概率是职场上招聘失败的,被迫留校的,什么牛鬼蛇神都会有
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务