關(guān)鍵詞:數(shù)組去重
題目描述:
Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
這道題需要更改原始輸入的數(shù)組并且返回去重后的數(shù)組長(zhǎng)度套才。
分為兩部分來(lái)思考:
- 去重?cái)?shù)組長(zhǎng)度計(jì)算
注意到這里的輸入數(shù)組是排好序的數(shù)組洗搂。所以可以用指針從頭開(kāi)始比較社露。并設(shè)置去重后的數(shù)組長(zhǎng)度為count=0. 用count也可以作為數(shù)組的指針肺樟,來(lái)表示數(shù)組在count這個(gè)位置的數(shù)值。
肯定要遍歷整個(gè)數(shù)組被啼,用一個(gè)for循環(huán)和i指針來(lái)做郑叠。
在這里我一開(kāi)始的思路是判斷count指針和i指針大小秋泳,如果count指針?biāo)傅臄?shù)小則將count++。最后count就是要求的數(shù)組長(zhǎng)度倡缠。 - 更改原始輸入數(shù)組
題目要求必須在原始數(shù)組上進(jìn)行更改而不能新建一個(gè)數(shù)組哨免。有一個(gè)隱含前提,去重?cái)?shù)組的長(zhǎng)度一定小于等于原始數(shù)組昙沦。那么琢唾,我們可以直接將大于當(dāng)前指針的數(shù)放入前一個(gè)已經(jīng)去重的數(shù)之后。
所以我們需要一個(gè)指針來(lái)保存去重列表的末尾部分,恰好這個(gè)指針就是count盾饮,當(dāng)i指針遍歷整個(gè)數(shù)組遇到一個(gè)新的數(shù)(只需要比count的大)時(shí)慧耍,可以將這個(gè)數(shù)放入count之后的格子里,直到i遍歷到達(dá)了整個(gè)原始數(shù)組的尾部丐谋。
需要考慮邊界條件芍碧。當(dāng)輸入數(shù)組nums的長(zhǎng)度為0和1時(shí),這個(gè)算法是否能夠給出0,1的返回值号俐?不能泌豆。count=0的初始設(shè)置在nums.length=1時(shí)還是等于0.因?yàn)閏ount==i==0,并不會(huì)進(jìn)入自增的過(guò)程吏饿∽傥#可以考慮返回count+1,然后在算法頂端加一個(gè)判斷條件猪落。數(shù)組的長(zhǎng)度是否為0贞远,如果是0,直接返回0就好了笨忌。
Java版本的代碼如下:
public int removeDuplicates(int[] nums) {
if(nums.length == 0){
return 0;
}
int count = 0;
for(int i=1; i< nums.length; i++) {
if(nums[count] < nums[i]){
nums[count+1] = nums[i];
count++;
}
}
return count+1;
}