2021-11-22:给定一个正数数组arr,表示每个小朋友的得分; 任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果; 假设所有的小朋友坐

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-11-22:给定一个正数数组arr,表示每个小朋友的得分; 任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果; 假设所有的小朋友坐相关的知识,希望对你有一定的参考价值。

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编写。代码如下:

package main

import "fmt"

func main() 
    arr := []int3, 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代码

以上是关于2021-11-22:给定一个正数数组arr,表示每个小朋友的得分; 任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果; 假设所有的小朋友坐的主要内容,如果未能解决你的问题,请参考以下文章

2022-11-03:给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果arr[i] != 0,表示i这里已经确

2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间。 给定一个正数m,表示有m个人等位。 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n<=

[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度

2021-08-10:给定一个正数数组arr,返回arr的子集不能累加出的最小正数。1)正常怎么做? 2)如果arr中肯定有1这个值,怎么做?

2022-01-11:给定一个正数数组arr长度为n正数x正数y。 你的目标是让arr整体的累加和<=0, 你可以对数组中的数num执行以下三种操作中的一种,且每个数最多能执行一次操作 : 1.

2022-05-02:给定一个数组arr,一个正数num,一个正数k, 可以把arr中的某些数字拿出来组成一组,要求该组中的最大值减去最小值<=num, 且该组数字的个数一定要正好等于k, 每个数字只