算法雜記(刪除排序數(shù)組中的重復(fù)項(xiàng))

題目:

給定一個(gè)排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素只出現(xiàn)一次,返回移除后數(shù)組的新長(zhǎng)度。
不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成。

這個(gè)問(wèn)題很常規(guī),找到一個(gè)重復(fù)的元素然后把之后的元素前移,接著繼續(xù)判斷,這個(gè)算法的復(fù)雜度為O(n^2).但是分析一下,把之后又的所有元素前移這個(gè)操作是可以優(yōu)化的,后面的數(shù)的位置并沒(méi)有確定,全部前移沒(méi)有必要,反而浪費(fèi)了資源,我們想要的只是把一個(gè)合適的數(shù)替代這里重復(fù)的數(shù),這樣就夠了。實(shí)現(xiàn)也不困難,我們只需要不停向下遍歷,把新的不重復(fù)的值添加在已知的不重復(fù)的值的后面,所以我們需要聲明一個(gè)int值來(lái)標(biāo)記當(dāng)前不重復(fù)序列的位置。
具體代碼參考如下:

class Solution {
public int removeDuplicates(int[] nums) {
// 第一個(gè)數(shù)肯定不是重復(fù)的數(shù),并且作為一個(gè)指針來(lái)計(jì)算不重復(fù)的數(shù)的個(gè)數(shù)
int i = 0;
for (int j = 1; j < nums.length; j++) {
// 如果不是重復(fù)的數(shù),就將指針 i 后移,同時(shí)將不重復(fù)的元素分配到指針 i 目前到達(dá)的位置
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
// i+1 是因?yàn)樾枰由系谝粋€(gè)不重復(fù)的數(shù)
return i + 1;
}
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容