LeetCode_26 刪除排序數(shù)組中的重復(fù)項(xiàng)(數(shù)組題)

題目地址:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

題目:
給定一個(gè)排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素只出現(xiàn)一次,返回移除后數(shù)組的新長(zhǎng)度。

不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成。

示例 1:

給定數(shù)組 nums = [1,1,2], 
函數(shù)應(yīng)該返回新的長(zhǎng)度 2, 并且原數(shù)組 nums 的前兩個(gè)元素被修改為 1, 2。 
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。

試題分析:

這道題是一道典型的有序數(shù)組操作題,要抓住三個(gè)要點(diǎn),一個(gè)是有序數(shù)組,另一個(gè)是原地刪除,還有一個(gè)是不考慮超出新長(zhǎng)度后面的元素。

有序數(shù)組意味著通過(guò)O(n)的時(shí)間復(fù)雜度,只需要循環(huán)一次就能夠剔除重復(fù)數(shù)字,要利用好有序這個(gè)特點(diǎn),當(dāng)有連續(xù)相等的數(shù)字時(shí)要做跳過(guò)處理。

原地刪除不使用額外空間,這就要求充分利用會(huì)被刪除的重復(fù)數(shù)字的位置。

綜上考慮下來(lái),可以使用快慢雙指針?lè)桨竵?lái)解該題,慢指針指向數(shù)組當(dāng)前循環(huán)過(guò)程中最后一個(gè)不重復(fù)的數(shù)值,快指針指向當(dāng)前循環(huán)體正在處理的數(shù)值。當(dāng)比較兩個(gè)指針的時(shí)候這就會(huì)有兩種情況發(fā)生,當(dāng)慢指針和快指針指向的值相等的時(shí)候說(shuō)明快指針指向了重復(fù)的值,這時(shí)候慢指針不移動(dòng),只對(duì)快指針進(jìn)行向后移動(dòng);當(dāng)快指針和慢指針指向的數(shù)值不等的時(shí)候,說(shuō)明這個(gè)數(shù)字是要加到新數(shù)組里的,這時(shí)候?qū)⒙羔樅笠苿?dòng)一位,用快指針指向的值賦給慢指針后移后指向的值,這時(shí)你可能會(huì)說(shuō)直接覆蓋慢指針后的值不就造成數(shù)據(jù)被覆蓋了?答案是不會(huì),自己思考下,慢指針后面的數(shù)據(jù)會(huì)有兩種情況,一種是和慢指針指向的值相等的重復(fù)數(shù)字,還有一種是和慢指針不相等的數(shù)字,如果慢指針是有連續(xù)重復(fù)值則用快指針指向的不相等的值進(jìn)行覆蓋重復(fù)值位置,如果慢指針和快指針之間沒(méi)有重復(fù)的可覆蓋空間慢快指針指向的是兩個(gè)不相等的數(shù)字,則在慢指針后移一位后,其實(shí)相當(dāng)于快指針將值賦值給了自己,這點(diǎn)非常巧妙,需要自己好好體會(huì)。

public int removeDuplicates(int[] nums) {
        if(nums.length == 0){
            return 0;
        }

        //i代表慢指針
        int i = 0;
        //j代表快指針
        int j = 1;

        for(;j<nums.length;j++){
            if(nums[i] != nums[j]){
                //慢指針指向的數(shù)字和快指針不相等的話則慢指針向后移動(dòng)一位
                i++;
                //將快指針指向的值賦值給慢指針指向的值,
                // 1)如果數(shù)組內(nèi)的值是連續(xù)不相等,則此時(shí)i=j快慢指針都指向同一個(gè)數(shù)值,相當(dāng)于原地賦值
                // 2)如果連續(xù)相等后的第一個(gè)不相等,則將i++后j指向的第一個(gè)不相等的值賦值給i指向的值
                nums[i] = nums[j];
            }
        }

        //i是下標(biāo)值需要加1才是length
        i++;
        return i;
    }

源碼路徑:com.monkey01.array.RemoveDuplicateFromSortedArray_26

配套測(cè)試代碼路徑:test目錄com.monkey01.array.RemoveDuplicateFromSortedArray_26Test

https://github.com/feiweiwei/LeetCode4Java.git

?著作權(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)容

  • 指針是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類(lèi)型。 運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,612評(píng)論 3 44
  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書(shū)筆記,整理的知識(shí)點(diǎn),也是為了防止忘記,尊重勞動(dòng)成果,轉(zhuǎn)載注明出處哦!如果你也喜歡,那...
    波波波先森閱讀 4,350評(píng)論 0 23
  • 自保和一對(duì)一的開(kāi)始打開(kāi)自己去融入群體,和更多的人去鏈接了!慢慢得到了群體的滋養(yǎng),然后更加深入和敞開(kāi)了!社交的開(kāi)始關(guān)...
    竺子閱讀 188評(píng)論 1 2
  • 明亮的黎明是一塊裹尸布裝著黑夜的尸體
    sH2nxy閱讀 384評(píng)論 0 3
  • 讀書(shū)日的筆記
    鍋?zhàn)哟笕?/span>閱讀 162評(píng)論 0 0

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