26. 刪除有序數組中的重復項
- 1 題目介紹
- 1 個人解題思路
- 1.1 解題代碼
- 1.2 思路解析
- 2、分析官方題解
- 2.1 快慢雙指針
1 題目介紹
給你一個 非嚴格遞增排列 的數組 nums ,請你 原地 刪除重復出現的元素,使每個元素 只出現一次 ,返回刪除后數組的新長度。元素的 相對順序 應該保持 一致 。然后返回 nums 中唯一元素的個數。
考慮 nums 的唯一元素的數量為 k ,你需要做以下事情確保你的題解可以被通過:
更改數組 nums ,使 nums 的前 k 個元素包含唯一元素,并按照它們最初在 nums 中出現的順序排列。nums 的其余元素與 nums 的大小不重要。
返回 k 。
1 個人解題思路
1.1 解題代碼
class Solution {public int removeDuplicates(int[] nums) {int length=nums.length;if(length==0){return 0;}int pro=0;int left=1;int right=1;while(right<length){if(nums[pro]==nums[right]){while(nums[pro]==nums[right]){right++;if(right>=length){return pro+1;}}nums[left]=nums[right]; }pro++; left++; }return pro+1;}
}
1.2 思路解析
- 如果長度為0或1直接返回
- 維持三個指針,一個pro指向真實不重復的數組,兩個左右指針left和right,左指針等待交換,右指針遍歷
- 只要pos指向的等于right指向的,right就往右走,如果走到頭說明大家一樣,直接返回pro+1(數組個數要在下表+1)。如果right停下來了,說明不一樣了,就把right賦給left。
- 不一樣的話pro和left向前即可。
2、分析官方題解
2.1 快慢雙指針
class Solution {public int removeDuplicates(int[] nums) {int n = nums.length;if (n == 0) {return 0;}int fast = 1, slow = 1;while (fast < n) {if (nums[fast] != nums[fast - 1]) {nums[slow] = nums[fast];++slow;}++fast;}return slow;}
}
跟我的思路一模一樣,沒什么說的,雙指針阿門
明日香鎮樓