Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2021-11-22:给定一个正数数组arr,表示每个小朋友的得

2021-11-22:给定一个正数数组arr,表示每个小朋友的得

原创
作者头像
福大大架构师每日一题
修改于 2021-11-23 00:46:01
修改于 2021-11-23 00:46:01
2100
举报

2021-11-22:给定一个正数数组arr,表示每个小朋友的得分;

任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果;

假设所有的小朋友坐成一个环形,返回在不破坏上一条规则的情况下,需要的最少糖果数。

来自网易。

答案2021-11-22:

1.求最小值的序号。

2.最小值放首位两端,构造n+1的数组arr2。

3.从左往右遍历arr2。left数组。

4.从右往左遍历arr2。right数组。

5.遍历根据left和right序号相同位置求最大值,累加n次,就是需要返回的值。

时间复杂度:O((N)。

额外空间复杂度:O(N)。

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

代码语言:txt
AI代码解释
复制
package main

import "fmt"

func main() {
    arr := []int{3, 2, 1, 2, 3}
    ret := minCandy(arr)
    fmt.Println(ret)
}

func minCandy(arr []int) int {
    if len(arr) == 0 {
        return 0
    }
    if len(arr) == 1 {
        return 1
    }
    n := len(arr)
    minIndex := 0
    for i := 0; i < n; i++ {
        if arr[i] <= arr[lastIndex(i, n)] && arr[i] <= arr[nextIndex(i, n)] {
            minIndex = i
            break
        }
    }

    nums := make([]int, n+1)
    for i := 0; i <= n; i, minIndex = i+1, nextIndex(minIndex, n) {
        nums[i] = arr[minIndex]
    }
    left := make([]int, n+1)
    left[0] = 1
    for i := 1; i <= n; i++ {
        left[i] = twoSelectOne(nums[i] > nums[i-1], left[i-1]+1, 1)
    }
    right := make([]int, n+1)
    right[n] = 1
    for i := n - 1; i >= 0; i-- {
        right[i] = twoSelectOne(nums[i] > nums[i+1], right[i+1]+1, 1)
    }
    ans := 0
    for i := 0; i < n; i++ {
        ans += getMax(left[i], right[i])
    }
    return ans
}

func nextIndex(i int, n int) int {
    return twoSelectOne(i == n-1, 0, (i + 1))
}

func lastIndex(i int, n int) int {
    return twoSelectOne(i == 0, (n - 1), (i - 1))
}

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

func twoSelectOne(c bool, a int, b int) int {
    if c {
        return a
    } else {
        return b
    }
}

执行结果如下:

图片
图片

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2021-05-20:给定一个数组arr, 返回如果排序之后,相邻两数
2021-05-20:给定一个数组arr, 返回如果排序之后,相邻两数的最大差值。要求:时间复杂度O(N) 。
福大大架构师每日一题
2021/05/20
3560
2021-05-20:给定一个数组arr, 返回如果排序之后,相邻两数
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一个气球都能获得分数,假设打爆气 球 的分数为 X,获得分数的规则如下: 1)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 R。 获得分数为 L_X_R。 2)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边所有气球都已经被打爆。获得分数为 L_X。 3)如果被打爆气球的左边所有的气球都已经被打爆;如果被打爆气球的右边有没被打爆的 气球,找到离被打爆气球最近的气球,假设分数为 R;如果被打爆气球的右边所有气球都 已经 被打爆。获得分数为 X_R。 4)如果被打爆气球的左边和右边所有的气球都已经被打爆。获得分数为 X。目标是打爆所有气球,获得每次打爆的分数。通过选择打爆气球的顺序,可以得到不同的总分,请返回能获得的最大分数。【举例】arr = {3,2,5} 如果先打爆3,获得3_2;再打爆2,获得2_5;最后打爆5,获得5;最后总分21 如果先打爆3,获得3_2;再打爆5,获得2_5;最后打爆2,获得2;最后总分18 如果先打爆2,获得3_2_5;再打爆3,获得3_5;最后打爆5,获得5;最后总分50 如果先打爆2,获得3_2_5;再打爆5,获得3_5;最后打爆3,获得3;最后总分48 如果先打爆5,获得2_5;再打爆3,获得3_2;最后打爆2,获得2;最后总分18 如果先打爆5,获得2_5;再打爆2,获得3_2;最后打爆3,获得3;最后总分19 返回能获得的最大分数为50。
福大大架构师每日一题
2021/05/04
3380
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, a
中间位置i需要达标,达标的条件是 : arri-1 > arri 或者 arri+1 > arri哪个都可以。
福大大架构师每日一题
2022/01/12
3670
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一个气球都能获得分数,假设打爆气 球 的分数为 X,获得
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一个气球都能获得分数,假设打爆气 球 的分数为 X,获得分数的规则如下: 1)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 R。获得分数为 L*X*R。2)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边所有气球都已经被打爆。获得分数为 L*X。3)如果被打爆气球的左边所有的气球都已经被打爆;如果被打爆气球的右边有没被打爆的 气球,找到离被打爆气球最近的气球,假设分数为 R;如果被打爆气球的右边所有气球都 已经 被打爆。获得分数为 X*R。4)如果被打爆气球的左边和右边所有的气球都已经被打爆。获得分数为 X。目标是打爆所有气球,获得每次打爆的分数。通过选择打爆气球的顺序,可以得到不同的总分,请返回能获得的最大分数。【举例】arr = {3,2,5} 如果先打爆3,获得3*2;再打爆2,获得2*5;最后打爆5,获得5;最后总分21 如果先打爆3,获得3*2;再打爆5,获得2*5;最后打爆2,获得2;最后总分18 如果先打爆2,获得3*2*5;再打爆3,获得3*5;最后打爆5,获得5;最后总分50 如果先打爆2,获得3*2*5;再打爆5,获得3*5;最后打爆3,获得3;最后总分48 如果先打爆5,获得2*5;再打爆3,获得3*2;最后打爆2,获得2;最后总分18 如果先打爆5,获得2*5;再打爆2,获得3*2;最后打爆3,获得3;最后总分19 返回能获得的最大分数为50。
福大大架构师每日一题
2021/08/05
3680
2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr
2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr,每个值表示 居民点的一维坐标,再给定一个正数 num,表示邮局数量。选择num个居民点建立num个 邮局,使所有的居民点到最近邮局的总距离最短,返回最短的总距离。【举例】arr=1,2,3,4,5,1000,num=2。第一个邮局建立在 3 位置,第二个邮局建立在 1000 位置。那么 1 位置到邮局的距离 为 2, 2 位置到邮局距离为 1,3 位置到邮局的距离为 0,4 位置到邮局的距离为 1, 5 位置到邮局的距 离为 2,1000 位置到邮局的距离为 0。这种方案下的总距离为 6, 其他任何方案的总距离都不会 比该方案的总距离更短,所以返回6。
福大大架构师每日一题
2021/05/04
4990
2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr
2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(
分别为 i 和 j,0 <= i < arr1.length 和 0 <= j < arr2.length,
福大大架构师每日一题
2023/12/13
1790
2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(
2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1
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
6060
2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。
福大大架构师每日一题
2021/02/25
3180
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-05-08:给定两个非负数组x和hp,长度都是N,再给定一个正数range
2021-05-08:给定两个非负数组x和hp,长度都是N,再给定一个正数range。x有序,xi表示i号怪兽在x轴上的位置;hpi表示i号怪兽的血量 。range表示法师如果站在x位置,用AOE技能打到的范围是: x-range,x+range,被打到的每只怪兽损失1点血量 。返回要把所有怪兽血量清空,至少需要释放多少次AOE技能?
福大大架构师每日一题
2021/05/10
5250
2021-05-08:给定两个非负数组x和hp,长度都是N,再给定一个正数range
​2021-05-14:给定一个数组arr,想知道arr中哪两个数的异或结果最大。
2021-05-14:给定一个数组arr,想知道arr中哪两个数的异或结果最大。返回最大的异或结果。
福大大架构师每日一题
2021/05/14
5560
​2021-05-14:给定一个数组arr,想知道arr中哪两个数的异或结果最大。
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
2021-04-04:给定一个非负数组arr,和一个正数m。 返回arr的所有子序列中累加和%m之后的最大值。
福大大架构师每日一题
2021/04/04
9200
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr,
2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr, val)可以返回数组arr中大于val的元素数量。
福大大架构师每日一题
2024/08/29
1610
2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr,
2021-11-27:给定一个数组arr,长度为N,做出一个结构,
2021-11-27:给定一个数组arr,长度为N,做出一个结构,可以高效的做如下的查询:
福大大架构师每日一题
2021/11/27
2430
2025-03-23:单调数组对的数目Ⅱ。用go语言,给定一个长度为 n 的正整数数组 nums,我们需要找出所有的单调数组对。
2025-03-23:单调数组对的数目Ⅱ。用go语言,给定一个长度为 n 的正整数数组 nums,我们需要找出所有的单调数组对。
福大大架构师每日一题
2025/03/24
780
2025-03-23:单调数组对的数目Ⅱ。用go语言,给定一个长度为 n 的正整数数组 nums,我们需要找出所有的单调数组对。
2021-04-05:给两个长度分别为M和N的整型数组...
2021-04-05:给两个长度分别为M和N的整型数组nums1和nums2,其中每个值都不大于9,再给定一个正数K。 你可以在nums1和nums2中挑选数字,要求一共挑选K个,并且要从左到右挑。返回所有可能的结果中,代表最大数字的结果。
福大大架构师每日一题
2021/04/05
4850
2021-04-05:给两个长度分别为M和N的整型数组...
​2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。<=K
2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的。返回其长度。
福大大架构师每日一题
2021/03/30
5210
​2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。<=K
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加出的最小正数。1)正常怎么做? 2)如果arr中肯定有1这个值,怎么做?
福大大架构师每日一题
2021/08/10
3840
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加
2021-05-06:给定一个二维数组matrix, 你可以从任何位置
2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 。返回能走出来的最长的递增链长度。
福大大架构师每日一题
2021/05/06
5750
2021-05-06:给定一个二维数组matrix, 你可以从任何位置
2025-05-23:数组的最大因子得分。用go语言,给定一个整数数组 nums。 定义“因子得分”为该数组中所有元素的最小公倍
2025-05-23:数组的最大因子得分。用go语言,给定一个整数数组 nums。
福大大架构师每日一题
2025/05/23
420
2025-05-23:数组的最大因子得分。用go语言,给定一个整数数组 nums。 定义“因子得分”为该数组中所有元素的最小公倍
2021-04-25:给定一个数组arr,和一个正数M,返回在
福大大 答案2021-04-25: 前缀和+左大右小的双端队列。时间太晚了,所以写得简单。 代码用golang编写。代码如下: package main import ( "container/list" "fmt" ) func main() { arr := []int{1, 2, -3, 4, -5} ret := maxSum(arr, 5) fmt.Println(ret) } // O(N)的解法,最优解 func maxSum(arr []int,
福大大架构师每日一题
2021/05/04
3880
2021-04-25:给定一个数组arr,和一个正数M,返回在
推荐阅读
2021-05-20:给定一个数组arr, 返回如果排序之后,相邻两数
3560
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
3380
2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, a
3670
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一个气球都能获得分数,假设打爆气 球 的分数为 X,获得
3680
2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr
4990
2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(
1790
2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1
6060
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
3180
2021-05-08:给定两个非负数组x和hp,长度都是N,再给定一个正数range
5250
​2021-05-14:给定一个数组arr,想知道arr中哪两个数的异或结果最大。
5560
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
9200
2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr,
1610
2021-11-27:给定一个数组arr,长度为N,做出一个结构,
2430
2025-03-23:单调数组对的数目Ⅱ。用go语言,给定一个长度为 n 的正整数数组 nums,我们需要找出所有的单调数组对。
780
2021-04-05:给两个长度分别为M和N的整型数组...
4850
​2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。<=K
5210
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加
3840
2021-05-06:给定一个二维数组matrix, 你可以从任何位置
5750
2025-05-23:数组的最大因子得分。用go语言,给定一个整数数组 nums。 定义“因子得分”为该数组中所有元素的最小公倍
420
2021-04-25:给定一个数组arr,和一个正数M,返回在
3880
相关推荐
2021-05-20:给定一个数组arr, 返回如果排序之后,相邻两数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档