1. 程式人生 > >【Leetcode】刪除陣列中的重複項

【Leetcode】刪除陣列中的重複項

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] + " "); } } }