app和网站开发人员工作职责,公司网站管理图片,宁波建设局网站首页,建筑网站带图解题目来源。
给你一个有序数组 nums #xff0c;请你** 原地** 删除重复出现的元素#xff0c;使得出现次数超过两次的元素只出现两次 #xff0c;返回删除后数组的新长度。
不要使用额外的数组空间#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下…题目来源。
给你一个有序数组 nums 请你** 原地** 删除重复出现的元素使得出现次数超过两次的元素只出现两次 返回删除后数组的新长度。
不要使用额外的数组空间你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
思路1移动元素法。从后遍历数组计数元素重复次数当遇到不重复元素且重复数量大于2时开始把后面子数组往前移缩小数组长度。
/*** param {number[]} nums* return {number}*/
var compressArry function (nums, i, j) {let n nums.length;for (let k i; k n; k) {nums[k - j] nums[k];}nums.length - j;
}
var removeDuplicates function (nums) {let i nums.length - 1,j 1;while (i - j 0) {if (nums[i - j] ! nums[i]) {//这时候的j就是重复次数if (j 2) {//将[i,nums.length-1]往前移j-2位compressArry(nums, i, j - 2);}//不管大于2还是小于等于2i在这时都要移动到i-j开始下一轮计数i i - j;j 1;} else {j;}}//最前面的重复数还没有清理现在开始清理if (j 2) {//将[i,nums.length-1]往前移j-2位compressArry(nums, i, j - 2);}return nums.length;
};时间复杂度 O ( n 2 ) O(n^2) O(n2)
空间复杂度 O ( 1 ) O(1) O(1)。
思路2重复次数达到3立马删除。
/*** param {number[]} nums* return {number}*/
var removeDuplicates function(nums) {if(nums.length2) return nums.length;let i0,j2;while(inums.length){if(nums[i]nums[j]){nums.splice(j,1);}else{i;j;}}return nums.length;
}时间复杂度O(n2)
空间复杂度O(1)
思路3双指针法。
/*** param {number[]} nums* return {number}*/
var removeDuplicates function (nums) {if(nums.length2){return nums.length;}let slow2;for(let fast2;fastnums.length;fast){if(nums[fast]!nums[slow-2]){//找到新元素nums[slow]nums[fast];}}nums.lengthslow;return slow;
};解释slow指针保证了其前面的元素重复次数不超过2fast指针则是向后寻找新元素一旦找到新元素将其插入到slow的位置。接着slow指针往后移一位fast继续寻找。如果fast找到数组末尾了那么说明新元素寻找完毕故设置数组长度为slow即为满足需要的数组。
时间复杂度O(n)
空间复杂度O(1)