美化数组的最少删除数
难度:
标签:
题目描述
代码结果
运行时间: 70 ms, 内存: 27.3 MB
/*
* 思路:
* 1. 使用Java Stream API来遍历数组并检查每个偶数索引的元素和下一个元素是否相等。
* 2. 使用IntStream来生成偶数索引,然后使用filter和count方法来统计需要删除的元素数量。
*/
import java.util.stream.IntStream;
public class Solution {
public int minDeletions(int[] nums) {
return (int) IntStream.range(0, nums.length - 1)
.filter(i -> i % 2 == 0 && nums[i] == nums[i + 1])
.count();
}
}
解释
方法:
本题解采用了一个一遍扫描的方法。首先定义一个变量left来记录当前正在处理的一对数中的第一个数。遍历数组nums,如果left为-1,表示当前没有悬挂的数,将当前数x赋值给left。如果left不为-1且x不等于left,表示当前数与上一个数不相等,可以组成一对有效的数,于是将left重置为-1。如果x等于left,表示与上一个数相等,需要删除当前这个数,删除计数ans增加1。最后,如果数组处理完后left仍有值(即数组长度为奇数),需要额外删除一个元素以保证数组长度为偶数,这时ans再加1。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在这个算法中,为什么初始化`left`为-1而不是使用一个布尔变量来判断是否有悬挂的元素?
▷🦆
算法如何处理连续相同元素超过两个的情况,比如输入是[1,1,1,2]?
▷🦆
算法最后通过`int(left >= 0)`来决定是否需要额外删除一个元素,这种方法是否能准确处理所有情况,例如当数组长度为奇数但最后一个元素已经被计入删除时的情况?
▷🦆
算法中提到如果`x != left`则构成一对有效的美丽数组元素,但算法实际上并没有构建或返回这样的一对数组,而是重置了`left`,这种方法是否确实符合题目要求的最少删除次数来构造美丽数组?
▷