非严格递增排列 的数组 nums , [原地] 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
示例 1:
输入: nums = [1,1,2]
输出: 2, nums = [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]
解释: 函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
解题1
我上来就是一顿循环,然后我切切切切切!
var removeDuplicates = function(nums) {
let i = 0
while(i<nums.length){
if(nums[i]== nums[i+1]){
nums.splice(i+1, nums.lastIndexOf(nums[i])-nums.indexOf(nums[i]))
}
i++
}
return nums.length
};
双指针
var removeDuplicates = function(nums) {
let fast = 1
let slow = 1
while (fast < nums.length) {
if (nums[fast] !== nums[fast - 1]) {
nums[slow] = nums[fast]
slow++
}
fast++
}
return slow
};
给你一个有序数组 nums ,请你 [原地] 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 [原地]修改输入数组 并在使用 O(1) 额外空间的条件下完成。
双指针
var removeDuplicates = function(nums) {
const n=nums.length
if(n<3){
return n
}
let slow = 2
let fast = 2
while (fast<n){
if(nums[slow-2]!==nums[fast]){
nums[slow]=nums[fast]
slow++
}
fast++
}
return slow
};
简洁的解法
var removeDuplicates = function(nums) {
let i = 0;
for (let num of nums) {
if (i < 2 || num > nums[i - 2]) {
nums[i++] = num;
}
}
return i;
};