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 := []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
}
}
执行结果如下:

2021-11-22:给定一个正数数组arr,表示每个小朋友的得分; 任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果; 假设所有的小朋友坐的更多相关文章
- 给定一个无序数组arr,求出需要排序的最短子数组长度。例如: arr = [1,5,3,4,2,6,7] 返回4,因为只有[5,3,4,2]需要排序。
思路 首先从左往右遍历,然后设定一个Max,如果遍历的过程中array[i]大于Max,则置换Max,若小于Max,则指定 k 记录该位置. 然后再从右往左遍历,设定一个Min,在遍历的过程中arra ...
- LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...
- 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...
- 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
/** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...
- (016)给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树(keep it up)
给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树. 因为数组是递增有序的.每次都在中间创建结点,类似二分查找的方法来间最小树. struct TreeNode { int data; Tr ...
- 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数
今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
- 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表
这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...
- Java -- 给定一个int数组,拼接出最大数值
public class ZhiJieTiaoDong { /* 给定一个数组:组合成最大数值 */ public String szpj(int[] args){ if(null == args | ...
- 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9
python解决方案 nums = [1,2,3,4,5,6] #假如这是给定的数组 target = 9 #假如这是给定的目标值 num_list = [] #用来装结果的容器 def run(nu ...
- 请编写一个方法,返回某集合的所有非空子集。 给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。
题解:观察测试样例,会发现每个子集的选择规律与二进制((2^n) - 1)到 1 的顺序生成的规律是一致的,样例中n=3,2^n-1=7,用二进制表示为111,其中每一位的1表示数组中的三个数都选择. ...
随机推荐
- leetcode-1072 Flip Columns For Maximum Number of Equal Rows
Given a matrix consisting of 0s and 1s, we may choose any number of columns in the matrix and flip e ...
- vim指令大全
Linux vi种 wq .wq!.x.q.q!区别 上面的命令只是在vi编辑命令中使用 wq:表示保存退出 wq!:表示强制保存退出 x:表示保存退出 wq和wq!的区别如下: 有些文件设置了只 ...
- github相关操作
github里面有很多大神写的代码,但是有不少小伙伴对使用它比较的生疏,下面我就把它的简单和常规的操作说一下,希望对你查看github有一定的帮助. watch :会持续收到该项目的动态 fork : ...
- 使用OpenOffice将office文件转为pdf
0.参考博客:https://blog.csdn.net/weixin_39468112/article/details/89203815 1.首先安装openOffice4.1 2.添加依赖 < ...
- NET 8 预览版 2 亮点是Blazor
.NET 团队在2023年3月14日发布了.NET 8预览版2,博客文章地址:https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-pre ...
- Java面试——Tomcat
更多内容,前往个人博客 一.Tomcat 顶层架构 Tomcat 中最顶层的容器是 Server,代表着整个服务器,从上图中可以看出,一个 Server可以包含至少一个 Service,用于具体提 ...
- Quicker 快速开发,控制脚本关闭(示例,鼠标连点器)
前言 一般写Quicker脚本的时候,是不需要考虑中途手动退出脚本的,因为多数脚本的运行时间不长,没多少中途退出的需求.但一旦脚本需要后台不定时间运行(可能要连续运行很长时间),如果不能手动控制脚本终 ...
- MySQL与Java常用数据类型的对应关系
一.字符串数据类型: MySQL类型名 大小 用途 对应Java类名 char 0-255 bytes 定长字符串 (姓名.性别.学号) String varchar 0-65535 bytes 变长 ...
- flutter ui---->一些类QQ的实现
整理一下比较有意思的类QQ的UI实现.Nothing that has meaning is easy. Easy doesn't enter into grown-up life. darken t ...
- CTF-Web-PHP反序列化
概念解释 PHP 反序列化漏洞又叫做 PHP 对象注入漏洞,我觉得这个表达很不直白,也不能说明根本的问题,不如我们叫他 PHP 对象的属性篡改漏洞好了(别说这是我说的~~) 反序列化漏洞的成因在于代码 ...