題目內容:
給你一個有序陣列 nums ,請你 原地 洗掉重復出現的元素,使每個元素 只出現一次 ,回傳洗掉后陣列的新長度,
不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 并在使用 O(1) 額外空間的條件下完成,

Leetcode題目鏈接(點擊即可跳轉)
思路分析
我們先假設沒有“原地”洗掉重復項的這個要求,如果我們要解決“洗掉有序陣列中的重復項”,能采取什么樣的方法?(開動小腦袋瓜,想一想!)
我們可以先創建一個臨時陣列,遍歷原陣列,將陣列中的非重復元素放到臨時陣列中,最后將臨時陣列的內容拷貝回原陣列,

為了達到“原地”的效果,能不能想辦法既不開辟臨時陣列,又能達到上面的效果呢?
(肯定是有辦法的,不然我也不會問你了,給自己挖坑呢不是?)
雙指標虛擬陣列法
實際上,對于陣列而言,指標的功能可以利用下標去實作,這里之所以要說是雙指標而不是雙下標,是因為這種方法在以后的鏈表中也會經常使用到,鏈表里面可不能用下標去解決問題,而需要用指標!!!
再使用這個方法的時候,一定要先考慮原陣列的長度,如果長度 <= 1,則不可能有重復項元素,直接回傳原陣列長度即可,(連兩個元素都沒有,哪來的重復項?別逗了,咦,別睡著了!)
演算法圖解:

函式介面實作
int removeDuplicates(int* nums, int numsSize){
//首先判斷陣列的長度是否小于2
if(numsSize < 2)
return numsSize;
int fast = 1;//fast從下標為1開始,即第二個元素
int slow = 0;//slow從第一個元素開始,下標為0
while(fast < numsSize){
if(nums[fast] != nums[slow]){
//先將slow + 1,然后將fast所在位置的值給slow,然后fast + 1
nums[++slow] = nums[fast++];//這是簡潔的寫法
}
else{
//fast位置值 = slow位置值,直接跳過
fast++;
}
}
return slow+1;//slow是最后一個元素的下標,則長度為slow+1
}

總結:
//情況1:陣列僅有一個元素,或者0個元素
//情況2:陣列里面至少有2個元素
//有序陣列,如果后面的元素跟前面的元素相同時,直接跳過這個元素 //不同時,將元素放到虛擬陣列中
注意:最后的回傳值應該是slow+1,而不是slow
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/399596.html
標籤:其他
下一篇:2021總結,欲望反光
