>[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] ## 快慢指針解法
* 定義兩個指針,進行比較如快慢指針值不同進行位置交換

>[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
};
~~~
- 刷題準備
- 統計數組中元素出現次數
- Leetcode -- 442數組中重復的數據
- leetcode -- 448 找到所有數組中消失的數字
- 字符類似題
- Leetcode -- 1002 查找共用字符
- Leetcode -- 1370上升下降字符串
- 指針類題解
- Leetcode -- 283 移動零
- Leetcode -- 26. 刪除有序數組中的重復項
- Leetcode -- 80. 刪除有序數組中的重復項 II
- Leetcode -- 27. 移除元素
- Leetcode -- 344. 反轉字符串
- Leetcode -- 125 驗證回文串
- Leetcode -- 11 盛最多水的容器
- Leetcode -- 1480. 一維數組的動態和