Leetcode旋轉(zhuǎn)數(shù)組

1似袁、題目描述

給定一個(gè)數(shù)組存璃,將數(shù)組中的元素向右移動(dòng) k 個(gè)位置淋叶,其中 k 是非負(fù)數(shù)阎曹。
示例 1:

輸入: [1,2,3,4,5,6,7] 和 k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右旋轉(zhuǎn) 1 步: [7,1,2,3,4,5,6]
向右旋轉(zhuǎn) 2 步: [6,7,1,2,3,4,5]
向右旋轉(zhuǎn) 3 步: [5,6,7,1,2,3,4]

示例 2:

輸入: [-1,-100,3,99] 和 k = 2
輸出: [3,99,-1,-100]
解釋: 
向右旋轉(zhuǎn) 1 步: [99,-1,-100,3]
向右旋轉(zhuǎn) 2 步: [3,99,-1,-100]

說明:
盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個(gè)問題。要求使用空間復(fù)雜度為 O(1)的原地算法处嫌。

2栅贴、解法

①:整體移動(dòng)法

以從下標(biāo)0開始長度為(size - k)的數(shù)組集合整體移動(dòng)k個(gè)單位,后面數(shù)字的依次往前移動(dòng),例如題目中舉出的第1個(gè)示例來說熏迹,
[1,2,3,4,5,6,7]移動(dòng)k = 3檐薯,也就是以第0個(gè)開始長度為(7 - 3 = 4)的數(shù)組集合([1,2,3,4])移動(dòng)3個(gè)長度單位

第一次移動(dòng): [7,1,2,3,4,5,6]
第二次移動(dòng): [6,7,1,2,3,4,5]
第三次移動(dòng): [5,6,7,1,2,3,4]
 public void rotate(int[] nums, int k) {
        k = k % nums.length;
        if (k == 0)return;
         for(int j = 0;j <k;j++){
            for (int i = j+(nums.length - 1 - k);i>=j;i--){
                swapNum(nums,i,i+1); 
            }
       }     
}
 public void swapNum(int[] num,int pre,int next){
        if (next > num.length - 1||next <0) return;
        num[pre] = num[pre]^num[next];
        num[next] = num[pre]^num[next];
        num[pre] = num[pre]^num[next];
    }

這是正常的思路的解法,但是題目要求是O(1)的時(shí)間復(fù)雜度注暗,而這個(gè)解法的時(shí)間復(fù)雜度卻是O(n^2)坛缕,因此不符合題目要求,這也有了下面的兩種解法友存。

②:翻轉(zhuǎn)法

這種解法需要畫一個(gè)圖來說明祷膳,請(qǐng)看下圖陶衅。


圖(1):翻轉(zhuǎn)法原理

哈哈,在這里請(qǐng)忽略下字體不美觀的因素屡立,還是來關(guān)注下主要算法核心,由此圖可以得出搀军,可以分3步走膨俐,第一次是從0到(size - k - 1)的翻轉(zhuǎn),第二次是(size - k)到size的翻轉(zhuǎn)罩句,第三次是整體的翻轉(zhuǎn)焚刺。

第一次翻轉(zhuǎn): [4,3,2,1,5,6,7]
第二次翻轉(zhuǎn): [4,3,2,1,7,6,5]
第三次翻轉(zhuǎn): [5,6,7,1,2,3,4]

代碼如下:

  public void rotate(int[] nums, int k) {
        k %= nums.length;
        int i = nums.length-k;
        reverse(nums, 0, i-1);
        reverse(nums,i,nums.length-1);
        reverse(nums,0,nums.length-1);
        
    }
    
    private void reverse(int[]nums, int start, int end){
        while(start<end){
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }

③:擴(kuò)展數(shù)組法(以空間換時(shí)間)

還是以[1,2,3,4,5,6,7]這個(gè)數(shù)組為例,可以再增加一個(gè)相同的數(shù)組成為[1,2,3,4,5,6,7,1,2,3,4,5,6,7]门烂,當(dāng)移動(dòng)k = 3個(gè)時(shí)乳愉,可以從這個(gè)數(shù)組得知是從下標(biāo)(size - k)起長度為size的數(shù)組[5,6,7,1,2,3,4]
代碼如下:

  public void rotate(int[] nums, int k) {
        k = k % nums.length;
        if (k == 0)return;
        int[] numscopy = new int[nums.length * 2];
        for (int i = 0; i < nums.length * 2; i++) {
            numscopy[i] = nums[i%nums.length];
        }
        for (int i = nums.length - k;i<2 * nums.length - k;i++){
            nums[i + k - nums.length] = numscopy[i];
        }
    }

經(jīng)測(cè)試,可行屯远!

附上leetcode此題鏈接:

https://leetcode-cn.com/problems/rotate-array/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔓姚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慨丐,更是在濱河造成了極大的恐慌坡脐,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件房揭,死亡現(xiàn)場(chǎng)離奇詭異备闲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捅暴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門恬砂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蓬痒,你說我怎么就攤上這事泻骤。” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵瞪讼,是天一觀的道長钧椰。 經(jīng)常有香客問我,道長符欠,這世上最難降的妖魔是什么嫡霞? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮希柿,結(jié)果婚禮上诊沪,老公的妹妹穿的比我還像新娘。我一直安慰自己曾撤,他們只是感情好端姚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挤悉,像睡著了一般渐裸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上装悲,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天昏鹃,我揣著相機(jī)與錄音,去河邊找鬼诀诊。 笑死洞渤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的属瓣。 我是一名探鬼主播载迄,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼抡蛙!你這毒婦竟也來了护昧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤溜畅,失蹤者是張志新(化名)和其女友劉穎捏卓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慈格,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怠晴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浴捆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒜田。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖选泻,靈堂內(nèi)的尸體忽然破棺而出冲粤,到底是詐尸還是另有隱情美莫,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布梯捕,位于F島的核電站厢呵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏傀顾。R本人自食惡果不足惜襟铭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望短曾。 院中可真熱鬧寒砖,春花似錦、人聲如沸嫉拐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婉徘。三九已至漠嵌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間判哥,已是汗流浹背献雅。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工碉考, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塌计,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓侯谁,卻偏偏與公主長得像锌仅,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墙贱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • 題目要求:給定一個(gè)數(shù)組热芹,將數(shù)組中的元素向右移動(dòng) k 個(gè)位置,其中 k 是非負(fù)數(shù)惨撇。示例 1: 示例 2: 說明: 1...
    G_dalx閱讀 255評(píng)論 0 0
  • 解法一: 使用取余的方法伊脓,但是因?yàn)橐陆ㄒ粋€(gè)數(shù)組,需要用到額外的空間魁衙。 解法二: 原地算法报腔,以 k 為分界線,將數(shù)...
    Little丶Jerry閱讀 279評(píng)論 0 0
  • 1. 找出數(shù)組中重復(fù)的數(shù)字 題目:在一個(gè)長度為n的數(shù)組里的所有數(shù)字都在0到n-1的范圍內(nèi)剖淀。數(shù)組中某些數(shù)字是重復(fù)的纯蛾,...
    BookThief閱讀 1,769評(píng)論 0 2
  • 花為初心,師妹所送纵隔,相隔了二十年的相遇翻诉。 曲為酒狂炮姨,酒狂心不狂。在初雪的早上碰煌,有隱隱的小紛擾喧囂舒岸。 終于有了真正意...
    東籬兒閱讀 224評(píng)論 0 2
  • 我是一粒種子,在大人們的呵護(hù)下一天天的長大了…… 這兩張圖片中的我多可愛芦圾,這時(shí)的我正在泥土中蓄勢(shì)待發(fā)……...
    Bonnie梟閱讀 432評(píng)論 0 6