给你一个正整数数组 nums 和一个整数 k 。
一次操作中,你可以将数组的最后一个元素删除,将该元素添加到一个集合中。
请你返回收集元素 1, 2, …, k 需要的 最少操作次数 。
class Solution:
def minOperations(self, nums: List[int], k: int) -> int:
array = [0] * k
times = 0
for i in range(len(nums) - 1, -1, -1):
times += 1
if nums[i] <= k and array[nums[i] - 1] == 0:
array[nums[i] - 1] = times
return max(array)
还可以提前跳出循环
class Solution:
def minOperations(self, nums: List[int], k: int) -> int:
array = [0] * k
times = 0
p = 0
for i in range(len(nums) - 1, -1, -1):
times += 1
if nums[i] <= k and array[nums[i] - 1] == 0:
array[nums[i] - 1] = times
p += 1
if p == k:
break
return max(array)
上面的计数数组就是一个哈希表map,本题正好可以使用bit压缩数组
由于元素范围在 [1,50],我们可以用一个 64 位整数表示集合
class Solution:
def minOperations(self, nums: List[int], k: int) -> int:
u = (2 << k) - 2 # 1~k
s, n = 0, len(nums)
for i in range(n - 1, -1, -1):
s |= 1 << nums[i]
if (s & u) == u:
return n - i
# 作者:灵茶山艾府
# 链接:https://leetcode.cn/problems/minimum-operations-to-collect-elements/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。