题目描述:

给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k

创建一个新数组遍历去重就不多说啦
我们看看能不能优化一下,依旧是大小不重要,所以依旧在原数组上进行修改遍历,我们可以通过记录当前重复的数据数量来确定当前数据如果不重复应该移动的位置,比如重复了两个数,那么这个位置未重复的数应该前移两个

注意的是:
记录的是当前重复的数据数所以返回时应该用总数减去

1
2
3
4
5
6
7
8
9
//代码如下
public int removeDuplicates(int[] nums) {
int count = 0;//重复的数据数
for (int i = 1; i < nums.length; i++) {
if (nums[i] == nums[i - count - 1]) count++;//重复+1
else nums[i - count] = nums[i];//非重复移动(没有重复数则原地赋值也不会出错)
}
return nums.length - count; //总数减去重复数即为非重复数
}