返回

最小删除次数使数组美丽

后端

好的,请稍等,以下是有关leetcode 2216. Minimum Deletions to Make Array Beautiful(python)的内容:

题目

给你一个整数数组 nums 。如果数组 nums 中存在两个元素 ij,其中 i != jabs(nums[i] - nums[j]) <= 1 ,那么我们称这对元素是 相邻 元素。

你希望使数组 nums 变得 美丽 。为了做到这一点,你可以执行以下操作 任意 次:

  • 选择一个数组 nums 中的相邻元素对,并删除它们。
  • 如果你选择删除元素 ij,那么你需要同时从 nums 中删除这两个元素。

请你返回使数组 nums 变得美丽所需的 最少 删除次数。

示例 1:

输入:nums = [1,1,2,3,5]
输出:1
解释:我们可以删除数字 5,使数组变成 [1,1,2,3]。

示例 2:

输入:nums = [1,1,2,2,3,3]
输出:2
解释:我们可以删除数字 23,使数组变成 [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

最终,我们统计出我们删除了多少个元素,并将这个值作为答案返回即可。