刪除有序陣列中的重複項
阿新 • • 發佈:2021-09-10
26. 刪除有序陣列中的重複項
難度簡單 給你一個有序陣列
nums
,請你原地刪除重複出現的元素,使每個元素只出現一次,返回刪除後陣列的新長度。
不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 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
。不需要考慮陣列中超出新長度後面的元素。
提示:
0 <= nums.length <= 3 * 104
-104<= nums[i] <= 104
nums
已按升序排列-
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
思路分析:
解本題的思路就在於,怎麼將重複元素放到陣列尾
一開始思路選擇了氣泡排序,將重複的元素往後挪,但是發現每次只能移動一位,而當某個元素並排出現多個,就無法有效的進行氣泡排序,甚至元素多起來的時候出現超時
在觀看了題解之後,雙指標解法: i用來等待新元素 j用來尋找新元素
用i記錄當前curNums,用j記錄下一個nums[j]
在遇到相同元素的時候,j移動,但是i不移動
直到遇到了不同的元素,i移動,並且將j遇到的不同元素賦在i指標指向的當前元素下,j繼續尋找不同的元素
程式碼如下:
class Solution { public int removeDuplicates(int[] nums) { // 使用雙指標 if(nums==null || nums.length == 1){ return nums.length; } int i = 0,j =1; while(j<nums.length){ if(nums[i]==nums[j]){ j++; }else{ i++; nums[i]=nums[j]; j++; } } return i+1; } }