【Leetcode】刪除陣列中的重複項
阿新 • • 發佈:2018-11-28
Leetcode
題目要求
給定一個排序陣列,你需要在原地刪除重複出現的元素,使每個元素最多出現兩次,返回移除後陣列的新長度
不要使用額外的陣列空間,你必須在原地修改輸入陣列並在O(1)額外空間的條件下完成
- 示例1.給定 nums = [1,1,1,2,2,3]
- 函式應該返回新長度length = 5,並且原陣列的前五個元素被修改為1,1,2,2,3
- 你不需要考慮陣列中超出新長度後面的元素
- 示例2.給定 nums = [0,0,1,1,1,1,2,3,3]
- 函式應該返回新長度length = 7,並且原陣列的前七個元素被修改為0,0,1,1,2,3,3
- 你不需要考慮陣列中超出新長度後面的元素
核心思想
這裡的核心思想是掃描替換,利用兩個座標指標,實現陣列元素的更新。替換也可以改為互換,但對於本題目要求,沒必要進行此操作。
完整程式碼如下
public class Solution {
public int replaceTwo(int[] nums){
if(nums.length <= 2) {
return nums.length;
}
//1,1,1,2,2,3
int count = 1;
//count為元素重複次數
int k = 1;
//核心思想是替換,將元素重複次數大於2的部分忽略,將其他合法元素移動到前面合法區域。
//這裡用i和k同時進行掃描,但是,當元素count不小於2時,(即兩數相等次數達到2,也就是說相同元素達到3時)
//這時,k會停下,直到i找到下一個與當前k-1指向當元素不相等的那一個座標,才繼續進行替換,重複所有操作。
for(int i = 1; i < nums.length; i++){
//如果相等,則重複次數加1
if(nums[i] == nums[i-1] ) {
if(count < 2) {
//當重複達到兩次時,才進行變換操作
nums[k++] = nums[i];
count++;
}
}else {
//如果遇到兩數不想等。則情況count次數
count = 1;
nums[k++] = nums[i];
}
}
return k;
}
public static void main(String[] args) {
Solution sl = new Solution();
int nums1[] = {0,0,1,1,1,2,3,3};
int nums2[] = {0,0,1,1,1,2,3,3};
int len1 = sl.replaceTwo(nums1);
int len2 = sl.replaceTwo(nums2);
for(int i = 0;i < len1; i++){
System.out.print(nums1[i] + " ");
}
System.out.println();
for(int j = 0;j < len2; j++){
System.out.print(nums2[j] + " ");
}
}
}