题目:使数组唯一的最小增量
题目描述:
给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。
返回使 A 中的每个值都是唯一的最少操作次数。
示例 1:
输入:[1,2,2]
输出:1
解释:经过一次 move 操作,数组将变为 [1, 2, 3]。
示例 2:
输入:[3,2,1,2,1,7]
输出:6
解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。
提示:
0 <= A.length <= 40000
0 <= A[i] < 40000
分析:
这道题我一开始就像错了,最近做他多最优解的题了,导致我还在想最少移动几次,智障了,其实先移动谁,怎么移动结果都是一样的,想明白这道题就简单了,先排序,相邻两个数之间进行比较,当遇到不满足条件时,让下一个数变成前面的数加1,增加移动次数。
代码:
func minIncrementForUnique(A []int) int {
n:=len(A)
count:=0
if n==1{
return count
}
sort.Ints(A)
for i:=1;i<n;i++{
if A[i]<=A[i-1]{
count+=A[i-1]+1-A[i]
A[i]=A[i-1]+1
}
}
return count
}
题目:令牌放置
题目描述:
你的初始能量为 P,初始分数为 0,只有一包令牌。
令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下:
如果你至少有 token[i] 点能量,可以将令牌置为正面朝上,失去 token[i] 点能量,并得到 1 分。
如果我们至少有 1 分,可以将令牌置为反面朝上,获得 token[i] 点能量,并失去 1 分。
在使用任意数量的令牌后,返回我们可以得到的最大分数。
示例 1:
输入:tokens = [100], P = 50
输出:0
示例 2:
输入:tokens = [100,200], P = 150
输出:1
示例 3:
输入:tokens = [100,200,300,400], P = 200
输出:2
提示:
tokens.length <= 1000
0 <= tokens[i] < 10000
0 <= P < 10000
分析:将tokens排序,因为我们一开始应该拿出最小的,为什么,首先先确定能不能得分,如果最小的都比P大,直接返回0就可以,不可能得分,其次,如果小,我们就要先得一分,然后往后走,及主要记录位置,等到不能得分的时候,也就是P太小的,这时候就要考虑是不是要失去一份换能量,要考虑两件事情,换能量之后是不是能得分,跟谁换,当然是根最大的换,都要失去一份,就要买一个最大的嘛,然后判断能不能得分,不能得分就不换,直接返回分值。
代码:
func bagOfTokensScore(tokens []int, P int) int {
if P==0{
return 0
}
n:=len(tokens)
if n==0{
return 0
}
sort.Ints(tokens)
if n>=1 && tokens[0]>P{
return 0
}
score:=0
i:=0
j:=n-1
for i<=j{
if tokens[i]<=P{
score++
P-=tokens[i]
i++
}else if tokens[i]>P && score>0 && i!=j {
if P+tokens[j]>=tokens[i]{
P+=tokens[j]
score--
}else{
return score
}
j--
}else{
return score
}
}
return score
}
题目:验证栈的序列
这个题之前已经写过了,可以看一下三十