合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
>[success] # Leetcode -- 26. 删除有序数组中的重复项 * 题目描述: 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。 将最终结果插入 nums 的前 k 个位置后返回 k 。 不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 * 示例 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 。不需要考虑数组中超出新长度后面的元素。   来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 >[danger] ##### 第一次解题思路暴力倒序删除 * 只要当前值和他前一个值相等,就将当前值删除 ~~~ /** * @param {number[]} nums * @return {number} */ var removeDuplicates = function(nums) { for(let i = nums.length-1;i>0;i--){ if(nums[i] === nums[i-1]){ nums.splice(i,1) } } return nums.length }; ~~~ >[danger] ##### 第二次解题思路暴力额外空间 * 去申请一个额外空间的数组用来记录,此方法会额外开辟新的内存空间,这种思路失败,因为不符合题中说的空间复杂度使用 **O(1)** * 类似解题比较前一个和后一个值不同才放入额外空间中 ~~~ /** * @param {number[]} nums * @return {number} */ var removeDuplicates = function(nums) { const ls = [] for(let i=0;i<nums.length;i++){ if(!ls.includes(nums[i])) ls.push(nums[i]) } return ls.length }; ~~~ >[info] ## 快慢指针解法 * 定义两个指针,进行比较如快慢指针值不同进行位置交换 ![](https://img.kancloud.cn/a4/f3/a4f33f5e1f0e18efc8cbb8e9d141b811_1129x758.png) >[danger] ##### js ~~~ /** * @param {number[]} nums * @return {number} */ var removeDuplicates = function(nums) { if (nums.length == 0) return 0 let slow = 0 let fast = 1 while(fast < nums.length){ if(nums[slow] !== nums[fast]){ ++slow nums[slow] = nums[fast] } ++fast } return slow+1 }; ~~~ >[danger] ##### java ~~~ class Solution { public int removeDuplicates(int[] nums) { int fast = 1; int slow = 0; while(fast < nums.length){ if(nums[fast] != nums[slow]){ slow ++; nums[slow] = nums[fast]; } fast ++; } return slow +1; } } ~~~ >[info] ## 比较有意思想法 ~~~ /** * @param {number[]} nums * @return {number} */ var removeDuplicates = function(nums) { if(nums.length === 0 || nums.length === 1) return nums.length /** 采用set集合将nums重复的元素删除 这里需要注意,针对本题需要在原数组进行操作,并且后台直接调用原数组信息 因此,需要实现nums值的修改 因此,需要注意 ES6 方法 Array.from() 是不会修改实参(即使是引用类型的传递)的 因此,这里通过遍历set集合直接对nums数组进行操作,实现对实参的修改 */ let i = 0 for (let key of Array.from(new Set(nums))) { nums[i++] = key } return i }; ~~~