第一题:使数组唯一的最小增量
题型描述:
给定整数数组 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
思路:
- 先将数组排序,从小到大
- 如果一个数比它前一个数小或者等于,说明有重复,我们要移到比前一数大一就行了
代码:
class Solution(object):
def minIncrementForUnique(self, A):
"""
:type A: List[int]
:rtype: int
"""
A.sort()
res = 0
n = len(A)
for i in range(1,n):
if A[i]<=A[i-1]:
res +=(A[i-1]-A[i]+1)
A[i] = A[i-1]+1
return res
上面是大神做法!
这是我的做法,如果看不懂可以私信我,感觉好蠢!时间复杂度也很高.
class Solution(object):
def minIncrementForUnique1(self, A):
res = [0 for _ in range(80001)]
# print(res)
for num in A:
res[num] += 1
# print(res)
i = 0
obj = 0
flag = 0
while i < 80001:
if res[i] > 1:
# print("er")
j = max(i,flag)
while j < 80001 and res[j] != 0:
j += 1
flag = j+1
res[j] = 1
res[i] -= 1
obj += (j-i)
if res[i] <=1:
i += 1
continue
return obj
第二题:验证栈序列
给定
pushed
和popped
两个序列,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回true
;否则,返回false
。示例 1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 输出:true 解释:我们可以按以下顺序执行: push(1), push(2), push(3), push(4), pop() -> 4, push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例 2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2] 输出:false 解释:1 不能在 2 之前弹出。
提示:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed
是popped
的排列。
思路:
这道题模拟过程就行了!
代码:
class Solution(object):
def validateStackSequences(self, pushed, popped):
"""
:type pushed: List[int]
:type popped: List[int]
:rtype: bool
"""
i = 0
j = 0
stack = []
n = len(pushed)
while i < n or stack:
if not stack:
stack.append(pushed[i])
i += 1
elif i >= n and stack[-1] != popped[j]:
return False
elif stack[-1] != popped[j]:
stack.append(pushed[i])
i += 1
elif stack[-1] == popped[j]:
j += 1
stack.pop()
return True
第三题:移除最多的同行或同列石头
在二维平面上,我们将石头放置在一些整数坐标点上。每个坐标点上最多只能有一块石头。
现在,move 操作将会移除与网格上的另一块石头共享一列或一行的石头。
我们最多能执行多少次 move 操作?
示例 1:
输入:stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]] 输出:5
示例 2:
输入:stones = [[0,0],[0,2],[1,1],[2,0],[2,2]] 输出:3
示例 3:
输入:stones = [[0,0]] 输出:0
提示:
1 <= stones.length <= 1000
0 <= stones[i][j] < 10000
思路:
这道题关于图的,属于一列或者一行是一个连通分量的,所以我们只要找找它有几个连通分量
代码:
class Solution(object):
def removeStones(self, stones):
"""
:type stones: List[List[int]]
:rtype: int
"""
n = len(stones)
flag = [False]*n
ret = 0
def dfs(idx):
flag[idx] = True
for i in range(n):
if not flag[i] and (stones[i][0] == stones[idx][0] or stones[i][1] == stones[idx][1]):
dfs(i)
for i in range(n):
if not flag[i]:
ret += 1
dfs(i)
return n - ret
第四题:令牌放置
你的初始能量为
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
思路:
贪心算法
代码:
class Solution(object):
def bagOfTokensScore(self, tokens, P):
"""
:type tokens: List[int]
:type P: int
:rtype: int
"""
tokens.sort()
j = len(tokens) - 1
i = 0
res = 0
cur = 0
while i <= j:
if P >= tokens[i]:
cur += 1
P -= tokens[i]
res = max(res,cur)
print(res)
i += 1
elif cur > 0:
P += tokens[j]
j -= 1
cur -= 1
else:
break
return res
这周周赛只做出来两道题,但是除了最后一题,我应该都可以做出来!
下周再接再厉!
加油!