每日编程(38)

题目:使数组唯一的最小增量

题目描述:
给定整数数组 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
}

题目:验证栈的序列

这个题之前已经写过了,可以看一下三十

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值