前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1,当arr[cur]>arr[cur-1

2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1,当arr[cur]>arr[cur-1

作者头像
福大大架构师每日一题
发布2021-08-05 16:11:02
3900
发布2021-08-05 16:11:02
举报

2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1,当arr[cur]>arr[cur-1]时,out[cur]>out[cur-1];当arr[cur]>arr[cur+1]时,out[cur]>out[cur+1]。求最小out的元素之和。比如[2,3,5,5,4],生成数组是[1,2,3,2,1],和是9。

福大大 答案2021-06-18:

1.从左往右遍历,生成left数组。当arr[cur]>arr[cur-1]时,left[cur]=left[cur-1]+1。其他情况,left[cur]=1。[2,3,5,5,4]的left数组是[1,2,3,1,1]。

2.从右往左遍历,生成right数组。当arr[cur]>arr[cur+1]时,right[cur]=right[cur+1]+1。其他情况,right[cur]=1。[2,3,5,5,4]的right数组是[1,1,1,2,1]。

3.生成数组out,out数组的i位置元素是left数组i位置元素和right数组i位置元素的最大值。[2,3,5,5,4]的out数组是[1,2,3,2,1]。

4.求数组out的累加和,这个累加和就是需要的返回值。

5.时间复杂度O(N)。空间复杂度O(N)。

代码用golang编写。代码如下:

代码语言:javascript
复制
package main

import "fmt"

func main() {
    arr := []int{2, 3, 5, 5, 4}
    ret := candy1(arr)
    fmt.Println(ret)
}

// 这是原问题的优良解
// 时间复杂度O(N),额外空间复杂度O(N)
func candy1(arr []int) int {
    if len(arr) == 0 {
        return 0
    }
    N := len(arr)
    left := make([]int, N)
    for i := 1; i < N; i++ {
        if arr[i-1] < arr[i] {
            left[i] = left[i-1] + 1
        }
    }
    right := make([]int, N)
    for i := N - 2; i >= 0; i-- {
        if arr[i] > arr[i+1] {
            right[i] = right[i+1] + 1
        }
    }
    ans := 0
    for i := 0; i < N; i++ {
        ans += getMax(left[i], right[i])
    }
    return ans + N
}

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

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/coding-for-great-offer/blob/main/src/class04/Code05_CandyProblem.java)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档