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
执行结果如下:
以上是关于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, 每个数字只