Remove Duplicates from Sorted Array II

每日算法——letcode系列

問題 Remove Duplicates from Sorted Array II


Difficulty:<strong>Medium</strong></br>

<p><p>

Follow up for "Remove Duplicates":<br />
What if duplicates are allowed at most <i>twice</i>?</p>
<p>

For example,<br />
Given sorted array <i>nums</i> = <code>[1,1,1,2,2,3]</code>,</p>
<p>
Your function should return length = <code>5</code>, with the first five elements of <i>nums</i> being <code>1</code>, <code>1</code>, <code>2</code>, <code>2</code> and <code>3</code>. It doesn't matter what you leave beyond the new length.
</p></p>

// C++
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        
    }
};

翻譯 移除有序數(shù)組中重復(fù)元素II


難度系數(shù):<strong>中等</strong></br>


接著上一個(gè)總是“刪除重復(fù)數(shù)”:<br />
如果可以重復(fù)的數(shù)最多只允許 <i>兩</i>次呢?</p>

例如,<br />
給定一個(gè)有序的數(shù)組 <i>nums</i> = <code>[1,1,1,2,2,3]</code>,

函數(shù)返回的長度應(yīng) = <code>5</code>,數(shù)組<i>nums</i>的前五個(gè)元素應(yīng)為 <code>1</code>, <code>1</code>, <code>2</code>, <code>2</code> 和<code>3</code>

思路

由于是有序的倦踢,上題是相鄰不能相等胃珍,現(xiàn)在相當(dāng)于是隔一個(gè)不能相等略吨,本質(zhì)上一樣, 可以和上一題寫一個(gè)通用的代碼

// C++
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
       
        int n = static_cast<int>(nums.size());
        
        if (n < 3){
            return n;
        }
        
        int index = 2;
        for (int i = 2; i < n; ++i){
            if (nums[index - 2] != nums[i]){
                nums[index++] = nums[i];
            }
        }
        for (int i = 0; i < n - index; ++i){
            nums.pop_back();
        }
        return index;
    }
};
// 通用
class Solution {
public:
    /**
     *  remove duplicates if the number of duplicates more than num
     * 
     *  @param nums <#nums description#>
     *  @param num  <#num description#>
     *
     *  @return size of new nums
     */
    int removeDuplicates(vector<int>& nums, int num) {
        
        int n = static_cast<int>(nums.size());
        
        if (n < num + 1){
            return n;
        }
        
        int index = num;
        for (int i = 2; i < n; ++i){
            if (nums[index - num] != nums[i]){
                nums[index++] = nums[i];
            }
        }
        for (int i = 0; i < n - index; ++i){
            nums.pop_back();
        }
        return index;
    }
};

前文延伸解決

注:前文中文版?zhèn)€人覺得翻譯有問題宫患,不應(yīng)該是有序的笼踩,應(yīng)該是一系列整數(shù), 有序的就太簡單了

分析

由于4 300 000 000大于$2{32}$,且1到$2{32}$中每個(gè)數(shù)都至少有一個(gè),所以必須有重復(fù)的數(shù)添祸,題目設(shè)置成這么大的數(shù),主要是不要考慮全部讀取到內(nèi)存的方案寻仗,為方便測試可以用1到256的取258個(gè)數(shù)(258 >$2^8$)來測試刃泌。

方案一:

用一個(gè)char類型的數(shù)據(jù),由于一個(gè)char占8個(gè)字節(jié)署尤,每個(gè)字節(jié)兩個(gè)比特位耙替,一共有256個(gè)比特位,讀取一個(gè)數(shù)曹体,如果這個(gè)數(shù)是2俗扇,先判斷char類型數(shù)據(jù)的第二個(gè)比特位上是否為0,如果為0就把設(shè)置為1箕别,如果為1代表這個(gè)數(shù)出現(xiàn), 時(shí)間復(fù)雜度$T_{n} = O{(n)} $, 其實(shí)本質(zhì)上就是hashmap的方案铜幽,只不過更省空間滞谢。

方案二:

二分法(注:《編程珠璣》推薦的方案)
讀到一個(gè)數(shù),最高比特位如果是0除抛,放在A堆爹凹,最高比特位如果是1放到B堆,這樣就把258镶殷,人為的分成了兩堆,現(xiàn)在如果哪堆的個(gè)數(shù)大于$256/2=128$, 證明重復(fù)的數(shù)在哪堆微酬,也有可能兩堆都有绘趋, 再讀最高位的下一位比特位再分堆,如此反復(fù)肯定能找到那個(gè)重復(fù)的數(shù)

延伸思考

如果是$2^{32}$ + 1個(gè)數(shù)呢颗管?也就是只有一個(gè)重復(fù)的數(shù)陷遮,怎么來找此數(shù)呢?有沒有更低的時(shí)間復(fù)雜度方案垦江?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帽馋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子比吭,更是在濱河造成了極大的恐慌绽族,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衩藤,死亡現(xiàn)場離奇詭異吧慢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赏表,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門检诗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓢剿,你說我怎么就攤上這事逢慌。” “怎么了间狂?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵攻泼,是天一觀的道長。 經(jīng)常有香客問我前标,道長坠韩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任炼列,我火速辦了婚禮只搁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俭尖。我一直安慰自己氢惋,他們只是感情好洞翩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焰望,像睡著了一般骚亿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熊赖,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天来屠,我揣著相機(jī)與錄音,去河邊找鬼震鹉。 笑死俱笛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的传趾。 我是一名探鬼主播迎膜,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浆兰!你這毒婦竟也來了磕仅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤簸呈,失蹤者是張志新(化名)和其女友劉穎榕订,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝶棋,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卸亮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玩裙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兼贸。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吃溅,靈堂內(nèi)的尸體忽然破棺而出溶诞,到底是詐尸還是另有隱情,我是刑警寧澤决侈,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布螺垢,位于F島的核電站,受9級特大地震影響赖歌,放射性物質(zhì)發(fā)生泄漏枉圃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一庐冯、第九天 我趴在偏房一處隱蔽的房頂上張望孽亲。 院中可真熱鬧,春花似錦展父、人聲如沸返劲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篮绿。三九已至孵延,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亲配,已是汗流浹背尘应。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吼虎,地道東北人菩收。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像鲸睛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子坡贺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容