解題方法二
方法三
給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須在原地 修改輸入陣列並在使用 o(1) 額外空間的條件下完成。
給定陣列 nums = [1,1,2],
函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1, 2。
你不需要考慮陣列中超出新長度後面的元素。
給定 nums = [0,0,1,1,1,2,2,3,3,4],
函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為 0, 1, 2, 3, 4。
你不需要考慮陣列中超出新長度後面的元素。
為什麼返回數值是整數,但輸出的答案是陣列呢?
請注意,輸入陣列是以「引用」方式傳遞的,這意味著在函式裡修改輸入陣列對於呼叫者是可見的。
你可以想象內部操作如下:
// nums 是以「引用」方式傳遞的。也就是說,不對實參做任何拷貝
int len =
removeduplicates
(nums)
;// 在函式裡修改輸入陣列對於呼叫者是可見的。
// 根據你的函式返回的長度, 它會列印出陣列中該長度範圍內的所有元素。
for(
int i =
0; i < len; i++
)
思路
這個思路稍微繁雜一點,而且相對於下面的這種方法,時間複雜度跟長。
可能是因為,之前做過重複字母計數這一塊,所以一開始想到了這一點,但這題完全沒有必要,具體看第二種方法。
想法是:理解為消消樂
操作有點繁瑣,需要仔細考慮遍歷的位置與計數。
考慮的角度:字元陣列本身去重。
**
class
solution
// 初始化引數
int current = nums[0]
;int count =0;
int length = nums.length;
for(
int i =
0; i < length; i++
)else
// 縮短陣列長度
length = length - count +1;
i -= count;
}// 重新規整
current = nums[i]
; count =1;
}}// 排除當最後那一段有重複
if(count >1)
return length;
}}
思路
遍歷記錄當前,可以存放字元的位置,同時找到與前面沒有重複的數字,進行替換。
思考角度:位置與字元的匹配
**
public
class
solution
}return nums.length ==0?
0: currentindex +1;
}}
思路
和方法二有點類似,應該說幾乎一樣,把他想成乙個棧。
假設前面都是沒有重複的字元,因為字元是進過排序的,那麼只要不與最後乙個相同,就可以壓入棧中。
和插入排序的思想有點類似
這個思想有乙個優點,就是當他是亂序時候,也可以行得通。
思考角度:搭建乙個特殊的資料結構
**
class
solution
}// 如果當前 nums = ,應該返回0
return nums.length ==0?
0: top +1;
}}
從排序陣列中刪除重複項
nums 是以 引用 方式傳遞的。也就是說,不對實參做任何拷貝 int len removeduplicates nums 在函式裡修改輸入陣列對於呼叫者是可見的。根據你的函式返回的長度,它會列印出陣列中該長度範圍內的所有元素。for int i 0 i len i 核心思想 list是有序的,將不...
從排序陣列中刪除重複項
給定乙個排序陣列,你需要在原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素被修改為1...
從排序陣列中刪除重複項
給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度2,並且原陣列 nums 的前兩個元素被修改為1,2...