基本操作法-反轉(zhuǎn)reverse

平時一些基本的算法要牢記谚殊,要成為我們算法基礎操作丧鸯,這樣解決問題時才能在基本操作的基礎上舉一反三嫩絮。常用的基本操作如下:

? ? ? 1)丛肢、reverse 基本操作具有O(n)的時間復雜度剿干, O(n)的空間復雜度蜂怎;

? ? ? ?2)怨愤、除此之外派敷,二分搜索撰洗、快速排序篮愉、優(yōu)先級隊列、堆试躏、平衡二叉搜索樹、散列表的各項時間设褐、空間復雜度泣刹,都是基本操作的例子,它們不僅對分析算法的復雜度有幫助椅您,更在我們設計算法的時候起到重要的作用。

本期例題:LeetCode 189 - Rotate Array[1](Easy)

給定一個數(shù)組寡键,將數(shù)組中的元素向右移動 k 個位置,其中 k 是非負數(shù)西轩。

下面將展示旋轉(zhuǎn)數(shù)組的三種不同的解法。

解法1:使用額外空間

這是最普通的一種解法藕畔。我們可以使用一個輔助數(shù)組存儲原數(shù)組末尾的 k 個數(shù)字马僻,然后再移動剩下的數(shù)字注服。數(shù)字移動的過程如下所示韭邓。

使用輔助數(shù)組進行移動

這種解法的時間復雜度是?溶弟,空間復雜度是?仍秤。很顯然可很,它使用了額外的空間,還可以進一步優(yōu)化凰浮。

解法2:環(huán)狀替換

有些人首先想到的是這個思路。我們可以輕松推出每個數(shù)字最后應該在的位置袜茧,那么就可以一個一個地把它們放到正確的位置上。以?笛厦、 為例纳鼎,移動的順序是:1 ? 3 ? 5 ? 7 ? 2 ? 4 ? 6 ? 1裳凸。如下圖所示贱鄙,所有的箭頭構(gòu)成了一個環(huán)姨谷。

n=7, k=2 時的環(huán)狀替換過程

那么我們的替換方法是:先用臨時變量保存 1逗宁,將 6 放到 1 處梦湘,再將 4 放到 6 處…… 以此類推瞎颗,最后將 1 放到 3 處。

不過哼拔,這種解法的正確性不容易證明引有。實際上倦逐,當? 是? ?的倍數(shù)時譬正,上面的這種替換方法并不成立僻孝。如下圖所示导帝,當?穿铆、 時您单,實際上存在兩個環(huán):

n=8, k=2 時的環(huán)狀替換過程

* 1 ? 3 ? 5 ? 7 ? 1

* 2 ? 4 ? 6 ? 8 ? 2

如果從 1 出發(fā)荞雏,將只能替換 1虐秦、3凤优、5悦陋、7 四個數(shù)筑辨,還需要再從 2 出發(fā)一遍俺驶。可見這種思路在實現(xiàn)上也比較麻煩暮现。雖然這種方法達到了? 的時間復雜度和? 的空間復雜度,但是由于證明和實現(xiàn)上的復雜楚昭,并不推薦。

解法3:reverse 操作

可能你已經(jīng)知道了 reverse 操作的解法抚太,如果你還不知道的話,那么這個解法會讓你恍然大悟尿贫,就像 Two Sum 問題的那個雙指針解法一樣电媳。先將整個數(shù)組反轉(zhuǎn)帅霜,再將數(shù)組的前后兩半(前 k 個數(shù)和后 k 個數(shù))分別反轉(zhuǎn)匆背,就可以實現(xiàn)數(shù)組的旋轉(zhuǎn)了身冀。

三次反轉(zhuǎn)(reverse)操作的過程如下圖所示:

三次反轉(zhuǎn)操作的過程

相應的代碼如下钝尸,非常簡單明了。這個解法容易理解珍促、容易證明铃辖、容易記憶猪叙,又能達到最好的? 時間娇斩、 空間穴翩,可以說是最完美的解法犬第。

public void rotate(int[] nums, int k) {

? ? int N = nums.length;

? ? k %= N;

? ? reverse(nums, 0, N);

? ? reverse(nums, 0, k);

? ? reverse(nums, k, N);

}

void reverse(int[] nums, int begin, int end) {

? ? for (int i = begin, j = end - 1; i < j; i++, j--) {

? ? ? ? int temp = nums[i];

? ? ? ? nums[i] = nums[j];

? ? ? ? nums[j] = temp;

? ? }

}

reverse 操作的更多應用

旋轉(zhuǎn)數(shù)組有一道推廣題目芒帕,反轉(zhuǎn)單詞:LeetCode 151 - Reverse Words in a String[4](Medium)

將字符串中的單詞順序進行反轉(zhuǎn)。例如:

* 輸入:"the sky is blue"

* 輸出:"blue is sky the"

另外背蟆,reverse 操作還可以用在一些字符串和數(shù)字轉(zhuǎn)化的題目中鉴分。例如:

* LeetCode 415 - Add Strings[5](Easy)

計算兩個字符串形式的非負整數(shù)的和带膀。

* LeetCode 504 - Base 7[6](Easy)

給定一個整數(shù)志珍,將其轉(zhuǎn)化為7進制垛叨,并以字符串形式輸出伦糯。

無論是做加法還是進制轉(zhuǎn)換嗽元,都是先計算結(jié)果的低位數(shù)字舔株,再到高位數(shù)字还棱。而輸出的是字符串形式,這意味著要不斷在字符串的開頭插入字符惭等,時間開銷很大。

一種解決方法是使用數(shù)組或棧來臨時保存結(jié)果的每一位數(shù)字辞做,最后再輸出成字符串琳要。當然還有另一個更簡單的方法:直接輸出一個“反著的”結(jié)果字符串秤茅,最后再將字符串反轉(zhuǎn)即可稚补。

總結(jié)

“容易想出解題思路”和“容易寫出實現(xiàn)代碼”其實是相輔相成的框喳。因為代碼實際上就是思路在紙上的落實课幕。我們在面試中,需要鍛煉這種能在有限時間內(nèi)寫出正確的乍惊、bug-free 代碼的能力。所以我們在做題的時候润绎,需要重點掌握的不是那些最快速撬碟、最花哨的解法莉撇,而是思路最清晰呢蛤、代碼最簡潔的解法棍郎。

本篇文章以 reverse 為例講述了基本操作的重要作用其障,希望你能在做題的過程中總結(jié)出更多的基本操作坝撑。下篇文章是姊妹篇静秆,將介紹“基本數(shù)據(jù)結(jié)構(gòu)”的作用,敬請期待抚笔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市殊橙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狱从,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件季研,死亡現(xiàn)場離奇詭異,居然都是意外死亡与涡,警方通過查閱死者的電腦和手機惹谐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門驼卖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酌畜,你說我怎么就攤上這事怎囚∏虐” “怎么了恳守?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長井誉。 經(jīng)常有香客問我蕉扮,道長颗圣,這世上最難降的妖魔是什么喳钟? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任在岂,我火速辦了婚禮奔则,結(jié)果婚禮上蔽午,老公的妹妹穿的比我還像新娘易茬。我一直安慰自己及老,他們只是感情好抽莱,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布骄恶。 她就那樣靜靜地躺著食铐,像睡著了一般僧鲁。 火紅的嫁衣襯著肌膚如雪虐呻。 梳的紋絲不亂的頭發(fā)上寞秃,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天斟叼,我揣著相機與錄音春寿,去河邊找鬼朗涩。 笑死,一個胖子當著我的面吹牛馋缅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绢淀,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼瘾腰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了崩侠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎楞抡,沒想到半個月后伟众,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體召廷,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡凳厢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年竞慢,在試婚紗的時候發(fā)現(xiàn)自己被綠了先紫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筹煮。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡遮精,死狀恐怖败潦,靈堂內(nèi)的尸體忽然破棺而出本冲,到底是詐尸還是另有隱情劫扒,我是刑警寧澤檬洞,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布粟关,位于F島的核電站疮胖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏澎灸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一性昭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧县遣,春花似錦糜颠、人聲如沸萧求。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽元旬。三九已至,卻和暖如春匀归,著一層夾襖步出監(jiān)牢的瞬間坑资,已是汗流浹背穆端。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工袱贮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留体啰,地道東北人攒巍。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像窑业,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子枕屉,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

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

  • 簡述 極客時間算法40講中所出現(xiàn)的leetcode算法題 題目 【鏈表】reverse-linked-list(反...
    BestbpF閱讀 4,468評論 0 4
  • 單例定義:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點搀擂。餓漢模式public class Singleto...
    小楊不想努力了閱讀 363評論 0 4
  • <center>#1 Two Sum</center> link Description:Given an arr...
    鐺鐺鐺clark閱讀 2,143評論 0 3
  • 算法思想貪心思想雙指針排序快速選擇堆排序桶排序荷蘭國旗問題二分查找搜索BFSDFSBacktracking分治動態(tài)...
    第六象限閱讀 3,065評論 0 0
  • 技術(shù)交流QQ群:1027579432哨颂,歡迎你的加入喷市! 歡迎關注我的微信公眾號:CurryCoder的程序人生 1....
    CurryCoder閱讀 1,836評論 0 2