26. 删除有序数组中的重复项(LeetCode)
题目条件
给你一个有序数组 nums(升序) ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
条件分析
1.nums 已按升序排列
2.原地删除,考虑使用交换或者赋值操作
题目思路
1.可以通过一个下标k记录不重复的元素,即[0,k]都是不重复的元素
2.遍历数组时,如果发现下标i和k所在位置的元素不相同(因为元素是升序,也就是说i和[0,k]之间的元素都不相等),nums[++k]=nums[i]
3.数组遍历完成后,返回k+1即可(k为下标,k+1才是数组长度)
编码如下
public int removeDuplicates(int[] nums) {
if (nums.length == 0) {
return 0;
}
int k = 0;
for (int i=1; i<nums.length; i++) {
if (nums[i] != nums[k]) {
// 注意此处k要先自增,否则k处所在元素会被覆盖,即将i所在元素放到k+1处
k++;
if (k != i) {
nums[k] = nums[i];
}
}
}
return k+1;
}
浙公网安备 33010602011771号