给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。 示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re…
解题思路: 老样子,暴力解法入手,先循环,然后判断nums[i]==nums[i+1],如果ture,nums.splice()重复的元素,一开始是用if判断,发现超过三个之后元素只会去除一个,后来改成while判断
var removeDuplicates = function(nums) {
for(let i=0;i<nums.length;i++){
let j=i+1;
while(nums[i]==nums[j]){
nums.splice(j,1)
}
}
};
解法二: 既然是操作数组,并且是原地修改,那就肯定要想到双指针法,顾名思义,双指针,就是有两个指针,给定一个新数组的指针i,然后进行for循环,if(nums[i]!=nums[j]),也就是说遇到了不是重复的元素,把i++,然后让nums[i]=nums[j],意思是把不重复的元素赋给了下一个位置,最后ruturn i+1返回新数组
var removeDuplicates = function(nums) {
let i = 0;
for(let j=0;j<nums.length;j++){
if(nums[i]!=nums[j]){
i++
nums[i]=nums[j]
}
}
return i+1
};
理解双指针
(输入[1,1,2,2,3]第一次循环,i=0,j=0,nums[i](1)==nums[j](1),nums=[1,1,2,2,3]
第二次循环,i=0,j=1,nums[i](1)==nums[j](1),nums=[1,1,2,2,3]
第三次循环,i=0,j=2,nums[i](1)!=nums[j](2),i++,nums=[1,2,2,2,3]
第四次循环,i=1,j=3,nums[i](2)==nums[j](2),nums=[1,2,2,2,3]
第五次循环,i=1,j=4,nums[i](2)!=nums[j](3),i++,nums=[1,2,3,2,3]
循环结束,此时nums=[1,2,3,2,3],i=2,所以要返回i+1为数组的长度才能得到[1,2,3]的正确答案
)
var removeDuplicates = function(nums) {
let i = 0;
for(let j=0;j<nums.length;j++){
if(i<1 || nums[i-1]!=nums[j]){
nums[i]=nums[j];
i++
}
}
return i
};
删除排序数组中的重复项二
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定 nums = [1,1,1,2,2,3],
函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
你不需要考虑数组中超出新长度后面的元素。 示例 2:
给定 nums = [0,0,1,1,1,1,2,3,3],
函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。
你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re…
解题思路:
还是双指针法,让元素最多重复两次,当i<2时,即数组长度=2,没有重复超过2次而言,当i>2时, nums[i-2]即为两次重复
var removeDuplicates = function(nums) {
let i=0;
for(let j=0;j<nums.length;j++){
if(i<2 || nums[i-2]!=nums[j]){
nums[i]=nums[j];
i++;
}
}
return i
};