1. 程式人生 > 實用技巧 >【LeetCode記錄】初級演算法:陣列之刪除排序陣列中的重複項

【LeetCode記錄】初級演算法:陣列之刪除排序陣列中的重複項

題目描述:

  給定一個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

  不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 O(1) 額外空間的條件下完成。

舉例:

  給定陣列 nums = [1,1,2],

  函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1, 2。

  你不需要考慮陣列中超出新長度後面的元素。

思路:

  因為不能建立新陣列,所以只能組間元素進行比較,由於是排好序的,因此只需要比較相鄰的兩個元素就可以。如果相同,就刪掉後一個元素,並使後面的元素都向前移一位。

  因此該程式應該包含兩個方法,【相同則刪除元素】和【用後一個元素替換前一個元素】。

  我原本是這麼想的,但是用後一個元素替換前一個元素其實就是刪除前一個元素的過程了,因此也只需要一個方法。

解答:

  Python裡面對於列表有方法remove,所以寫起來很簡潔。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        i = 0
        while i < len(nums) - 1:
            if nums[i] == nums[i + 1]:
                nums.remove(nums[i])
            
else: i += 1 print(len(nums))

  下面是用java實現的,思路是

public static void main(String[] args) {
        int[] nums = {0,0,1,1,1,2,2,3,3,4,4,5};
        int i = 0;
        for(int j = 1;j< nums.length-1; j++){
            if(nums[j] != nums[j+1])
                i++;
                nums[i] 
= nums[j]; } System.out.println(i+1); }

  可以發現對陣列內容進行的比較是【j】從下標為1的元素開始比較,程式最後返回的是i+1,因為當第一個不相等出現的時候,不相等的元素是2個。