|
| 1 | +### 题目描述 |
| 2 | + |
| 3 | +这是 LeetCode 上的 **[2216. 美化数组的最少删除数](https://leetcode.cn/problems/minimum-deletions-to-make-array-beautiful/solutions/2535327/gong-shui-san-xie-zhi-ji-ben-zhi-de-ji-j-dk05/)** ,难度为 **中等**。 |
| 4 | + |
| 5 | +Tag : 「模拟」 |
| 6 | + |
| 7 | + |
| 8 | + |
| 9 | +给你一个下标从 `0` 开始的整数数组 `nums`,如果满足下述条件,则认为数组 `nums` 是一个 美丽数组 : |
| 10 | + |
| 11 | +* `nums.length` 为偶数 |
| 12 | +* 对所有满足 `i % 2 == 0` 的下标 `i`,`nums[i] != nums[i + 1]` 均成立 |
| 13 | + |
| 14 | +注意,空数组同样认为是美丽数组。 |
| 15 | + |
| 16 | +你可以从 `nums` 中删除任意数量的元素。当你删除一个元素时,被删除元素右侧的所有元素将会向左移动一个单位以填补空缺,而左侧的元素将会保持 不变 。 |
| 17 | + |
| 18 | +返回使 `nums` 变为美丽数组所需删除的最少元素数目。 |
| 19 | + |
| 20 | +示例 1: |
| 21 | +``` |
| 22 | +输入:nums = [1,1,2,3,5] |
| 23 | +
|
| 24 | +输出:1 |
| 25 | +
|
| 26 | +解释:可以删除 nums[0] 或 nums[1] ,这样得到的 nums = [1,2,3,5] 是一个美丽数组。可以证明,要想使 nums 变为美丽数组,至少需要删除 1 个元素。 |
| 27 | +``` |
| 28 | +示例 2: |
| 29 | +``` |
| 30 | +输入:nums = [1,1,2,2,3,3] |
| 31 | +
|
| 32 | +输出:2 |
| 33 | +
|
| 34 | +解释:可以删除 nums[0] 和 nums[5] ,这样得到的 nums = [1,2,2,3] 是一个美丽数组。可以证明,要想使 nums 变为美丽数组,至少需要删除 2 个元素。 |
| 35 | +``` |
| 36 | + |
| 37 | +提示: |
| 38 | +* $1 <= nums.length <= 10^5$ |
| 39 | +* $0 <= nums[i] <= 10^5$ |
| 40 | + |
| 41 | +--- |
| 42 | + |
| 43 | +### 模拟 |
| 44 | + |
| 45 | +使用变量 `cnt` 代表已删除的元素个数,由于每次删除元素,剩余元素都会往前移动,因此当前下标为 $i - cnt$。 |
| 46 | + |
| 47 | +处理 `nums` 过程中,若当前下标为偶数,且与下一位置元素相同,那么当前元素需被删除,令 `cnt` 自增。 |
| 48 | + |
| 49 | +最终数组长度为 $n - cnt$,若长度为奇数,需要再额外删除结尾元素(`cnt` 再加一),否则 `cnt` 即为答案。 |
| 50 | + |
| 51 | +Java 代码: |
| 52 | + |
| 53 | +```Java |
| 54 | +class Solution { |
| 55 | + public int minDeletion(int[] nums) { |
| 56 | + int n = nums.length, cnt = 0; |
| 57 | + for (int i = 0; i < n; i++) { |
| 58 | + if ((i - cnt) % 2 == 0 && i + 1 < n && nums[i] == nums[i + 1]) cnt++; |
| 59 | + } |
| 60 | + return (n - cnt) % 2 != 0 ? cnt + 1 : cnt; |
| 61 | + } |
| 62 | +} |
| 63 | +``` |
| 64 | +C++ 代码: |
| 65 | +```C++ |
| 66 | +class Solution { |
| 67 | +public: |
| 68 | + int minDeletion(vector<int>& nums) { |
| 69 | + int n = nums.size(), cnt = 0; |
| 70 | + for (int i = 0; i < n; i++) { |
| 71 | + if ((i - cnt) % 2 == 0 && i + 1 < n && nums[i] == nums[i + 1]) cnt++; |
| 72 | + } |
| 73 | + return (n - cnt) % 2 != 0 ? cnt + 1 : cnt; |
| 74 | + } |
| 75 | +}; |
| 76 | +``` |
| 77 | +Python 代码: |
| 78 | +```Python |
| 79 | +class Solution: |
| 80 | + def minDeletion(self, nums: List[int]) -> int: |
| 81 | + n, cnt = len(nums), 0 |
| 82 | + for i in range(n): |
| 83 | + if (i - cnt) % 2 == 0 and i + 1 < n and nums[i] == nums[i + 1]: |
| 84 | + cnt += 1 |
| 85 | + return cnt + 1 if (n - cnt) % 2 != 0 else cnt |
| 86 | +``` |
| 87 | +TypeScript 代码: |
| 88 | +```TypeScript |
| 89 | +function minDeletion(nums: number[]): number { |
| 90 | + let n = nums.length, cnt = 0; |
| 91 | + for (let i = 0; i < n; i++) { |
| 92 | + if ((i - cnt) % 2 == 0 && i + 1 < n && nums[i] == nums[i + 1]) cnt++; |
| 93 | + } |
| 94 | + return (n - cnt) % 2 != 0 ? cnt + 1 : cnt; |
| 95 | +}; |
| 96 | +``` |
| 97 | +* 时间复杂度:$O(n)$ |
| 98 | +* 空间复杂度:$O(1)$ |
| 99 | + |
| 100 | +--- |
| 101 | + |
| 102 | +### 最后 |
| 103 | + |
| 104 | +这是我们「刷穿 LeetCode」系列文章的第 `No.2216` 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。 |
| 105 | + |
| 106 | +在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。 |
| 107 | + |
| 108 | +为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。 |
| 109 | + |
| 110 | +在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。 |
0 commit comments