最小删除次数使数组美丽
2023-11-21 14:05:21
好的,请稍等,以下是有关leetcode 2216. Minimum Deletions to Make Array Beautiful(python)的内容:
题目
给你一个整数数组 nums
。如果数组 nums
中存在两个元素 i
和 j
,其中 i != j
且 abs(nums[i] - nums[j]) <= 1
,那么我们称这对元素是 相邻 元素。
你希望使数组 nums
变得 美丽 。为了做到这一点,你可以执行以下操作 任意 次:
- 选择一个数组
nums
中的相邻元素对,并删除它们。 - 如果你选择删除元素
i
和j
,那么你需要同时从nums
中删除这两个元素。
请你返回使数组 nums
变得美丽所需的 最少 删除次数。
示例 1:
输入:nums = [1,1,2,3,5]
输出:1
解释:我们可以删除数字 5,使数组变成 [1,1,2,3]。
示例 2:
输入:nums = [1,1,2,2,3,3]
输出:2
解释:我们可以删除数字 2 和 3,使数组变成 [1,1,2,2]。
提示:
1 <= nums.length <= 10^5
0 <= nums[i] <= 10^9
思路
这道题是一道贪心算法题目,主要考察我们对于贪心算法的理解和应用能力。
我们只需要按照最朴素的思想进行解题即可。
具体地,我们可以先对数组 nums
进行排序,然后从左到右遍历数组 nums
。
对于数组 nums
中的每个元素 nums[i]
,我们判断 nums[i]
是否与 nums[i-1]
相邻。
如果 nums[i]
与 nums[i-1]
相邻,那么我们就将 nums[i]
删除。
如果 nums[i]
与 nums[i-1]
不相邻,那么我们就将 nums[i]
保留。
如此往复,直到我们遍历完整个数组 nums
。
最终,我们统计出我们删除了多少个元素,并将这个值作为答案返回即可。
代码
def minDeletions(nums):
"""
:type nums: List[int]
:rtype: int
"""
# 对数组 nums 进行排序
nums.sort()
# 初始化删除次数为 0
delete_count = 0
# 从左到右遍历数组 nums
for i in range(1, len(nums)):
# 判断 nums[i] 是否与 nums[i-1] 相邻
if nums[i] == nums[i-1]:
# 如果 nums[i] 与 nums[i-1] 相邻,那么我们就将 nums[i] 删除
delete_count += 1
else:
# 如果 nums[i] 与 nums[i-1] 不相邻,那么我们就将 nums[i] 保留
continue
# 返回删除次数
return delete_count
# 测试代码
nums = [1, 1, 2, 3, 5]
print(minDeletions(nums)) # 1
nums = [1, 1, 2, 2, 3, 3]
print(minDeletions(nums)) # 2
复杂度分析
- 时间复杂度:
O(n log n)
,其中n
是数组nums
的长度。这是因为我们首先对数组nums
进行排序,然后从左到右遍历数组nums
,判断每个元素是否与前一个元素相邻。 - 空间复杂度:
O(1)
,因为我们只需要使用几个变量来存储临时结果。
总结
这道题是一道贪心算法题目,主要考察我们对于贪心算法的理解和应用能力。
我们只需要按照最朴素的思想进行解题即可。
具体地,我们可以先对数组 nums
进行排序,然后从左到右遍历数组 nums
。
对于数组 nums
中的每个元素 nums[i]
,我们判断 nums[i]
是否与 nums[i-1]
相邻。
如果 nums[i]
与 nums[i-1]
相邻,那么我们就将 nums[i]
删除。
如果 nums[i]
与 nums[i-1]
不相邻,那么我们就将 nums[i]
保留。
如此往复,直到我们遍历完整个数组 nums
。
最终,我们统计出我们删除了多少个元素,并将这个值作为答案返回即可。