题目
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成
作者:力扣 (LeetCode)
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2gy9m/
来源:力扣(LeetCode)
理解
删除升序数组中的重复项
1. 审题:
输入:题目给的测试数据是有顺序的数组
要求:在原地删除重复的元素
输出:不重复的元素个数
2. 做法:
使用双指针fast和slow
如果nums[i]=nums[j]那么中间的所有元素都是相等的,所有可以直接把j+1付给nums[slow],就可以实现在原地修改。
3. 两个语言区别
java
nums.length()
if while 后面要跟()不跟:
每个句子后面加分号
python
if not nums
len(nums)
if while 后面直接跟条件要加冒号
题解
java
class Solution {
public int removeDuplicates(int[] nums) {
int n = nums.length;
if (n == 0){
return 0;
}
int fast = 1;
int slow = 1;
while(n > fast){
if (nums[fast] != nums[fast-1]){
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
}
python
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 0
fast = slow = 1
n = len(nums)
while n>fast:
if nums[fast]>nums[fast-1]:
nums[slow]=nums[fast]
slow+=1
fast+=1
return slow