LC 旋轉(zhuǎn)矩陣

給你一幅由 N × N 矩陣表示的圖像榆鼠,其中每個(gè)像素的大小為 4 字節(jié)馍驯。請(qǐng)你設(shè)計(jì)一種算法,將圖像旋轉(zhuǎn) 90 度兑燥。

不占用額外內(nèi)存空間能否做到?

示例 1:
給定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋轉(zhuǎn)輸入矩陣琴拧,使其變?yōu)?
[
[7,4,1],
[8,5,2],
[9,6,3]
]

示例 2:
給定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋轉(zhuǎn)輸入矩陣,使其變?yōu)?
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]

Solution:

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        
        """
        size = len(matrix[0])
        times = size
        for i in range(times):
            if times >= 2:
                for j in range(i, times - 1):
                    tmp = matrix[i][j]
                    matrix[i][j] = matrix[size - j - 1][i]
                    matrix[size - j - 1][i] = matrix[size - i - 1][size - j - 1]
                    matrix[size - i - 1][size - j - 1] = matrix[j][size - i - 1]
                    matrix[j][size - i - 1] = tmp
                times = times - 1
            else:
                break

解題思路:
這個(gè)題初拿到手嘱支,糾結(jié)了什么叫不用額外的內(nèi)存空間蚓胸,其實(shí)就是原地算法。一個(gè)原地算法(in-place algorithm)是一種使用小的除师,固定數(shù)量的額外之空間來(lái)轉(zhuǎn)換資料的算法沛膳。當(dāng)算法執(zhí)行時(shí),輸入的資料通常會(huì)被要輸出的部分覆蓋掉汛聚。簡(jiǎn)而言之锹安,我理解的原地就是覆蓋原數(shù)據(jù),而且你只能借助固定數(shù)量的額外空間倚舀,比如一個(gè)temp叹哭,而不是將數(shù)組放到一個(gè)新的變量里。下面是我先想到的用tmp輔助更新數(shù)據(jù)的思路痕貌。

  1. 找規(guī)律风罩,旋轉(zhuǎn)九十度,那么其實(shí)我們可以發(fā)現(xiàn)舵稠,經(jīng)過(guò)matrix[i][j]經(jīng)過(guò)旋轉(zhuǎn)超升,這個(gè)數(shù)字在第幾行就變到了倒數(shù)第幾列入宦,在第幾列就變到了第幾行,也就是matrix[i][j] -> matrix[j][size - i - 1]室琢,拿幾個(gè)具體的例子看看乾闰,這里我在圖里舉例了四個(gè)角的變換,不難發(fā)現(xiàn)這個(gè)規(guī)律

    image.png

  2. 考慮怎么換呢盈滴,倆倆置換是不可能的涯肩,因?yàn)槲覀円呀?jīng)找到規(guī)律了,如果倆倆置換雹熬,那原來(lái)的數(shù)字會(huì)被替換掉宽菜,規(guī)律就不成立了,于是我們可以選擇四個(gè)四個(gè)的變竿报,因?yàn)槊克膫€(gè)變換都會(huì)是一個(gè)環(huán)铅乡,規(guī)律還是成立。(最后介紹了不會(huì)被替換的簡(jiǎn)便方法)


    image.png
  3. 下面考慮該怎么換呢烈菌,只用一個(gè)tmp我們可以一次將四個(gè)數(shù)字變換到位阵幸,意思跟冒泡排序差不多,但是這回得倒著推芽世,先把1給tmp挚赊,再把7給1,9給7济瓢,3給9荠割,最后把tmp給3。如上圖藍(lán)色的圓圈編號(hào)的順序操作旺矾,順序無(wú)所謂蔑鹦,懂怎么個(gè)流程就行了。這種旋轉(zhuǎn)屢試不爽


    image.png
  4. 下面我們找需要旋轉(zhuǎn)多少次箕宙,怎么樣才結(jié)束呢嚎朽,看上圖,
    當(dāng)size為3的時(shí)候柬帕,我只需要做一次外層的旋轉(zhuǎn)哟忍,且這個(gè)外層旋轉(zhuǎn)做了兩次(0,0)和(0,1)所在的兩個(gè)環(huán)。
    當(dāng)size==4 的時(shí)候做了2層旋轉(zhuǎn)陷寝,最外面的那一層做了(0,0),(0,1)(0,2)環(huán)旋轉(zhuǎn),內(nèi)層做了(1,1)環(huán)旋轉(zhuǎn)
    當(dāng)size==5的時(shí)候锅很,做了3層旋轉(zhuǎn),最外面一層做了(0,0)(0,1)(0,2)(0,3),內(nèi)一層(1,1)(1,2)
    可以發(fā)現(xiàn)盼铁,每往內(nèi)一層粗蔚,需要旋轉(zhuǎn)的正方形的邊長(zhǎng) - 2,直到最里面那層的正方形小于2饶火,也就是只剩1個(gè)或者沒(méi)有了就停止了旋轉(zhuǎn)了鹏控。

Note:
本來(lái)以為不用temp值會(huì)被替換掉致扯,后來(lái)嘗試了一下發(fā)現(xiàn),python可以同時(shí)對(duì)多個(gè)值操的置換的時(shí)候不會(huì)被覆蓋当辐,所以把代碼更新了一下

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        
        """
        size = len(matrix[0])
        times = size
        for i in range(times):
            if times >= 2:
                for j in range(i, times - 1):
                    matrix[i][j], matrix[size - j - 1][i], matrix[size - i - 1][size - j - 1], matrix[j][size - i - 1] = \
                matrix[size - j - 1][i], matrix[size - i - 1][size - j - 1], matrix[j][size - i - 1], matrix[i][j]
                    # tmp = matrix[i][j]                    
                    # matrix[size - j - 1][i] = matrix[size - i - 1][size - j - 1]
                    # matrix[size - i - 1][size - j - 1] = matrix[j][size - i - 1]
                    # matrix[j][size - i - 1] = tmp
                times = times - 1
            else:
                break
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抖僵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缘揪,更是在濱河造成了極大的恐慌耍群,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件找筝,死亡現(xiàn)場(chǎng)離奇詭異蹈垢,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)袖裕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)曹抬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人急鳄,你說(shuō)我怎么就攤上這事谤民。” “怎么了疾宏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵张足,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我坎藐,道長(zhǎng)为牍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任岩馍,我火速辦了婚禮吵聪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兼雄。我一直安慰自己,他們只是感情好帽蝶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赦肋。 她就那樣靜靜地躺著,像睡著了一般励稳。 火紅的嫁衣襯著肌膚如雪佃乘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天驹尼,我揣著相機(jī)與錄音趣避,去河邊找鬼。 笑死新翎,一個(gè)胖子當(dāng)著我的面吹牛程帕,可吹牛的內(nèi)容都是我干的住练。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼愁拭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼讲逛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起岭埠,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盏混,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后惜论,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體许赃,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年馆类,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了混聊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹦掐,死狀恐怖技羔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卧抗,我是刑警寧澤藤滥,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站社裆,受9級(jí)特大地震影響拙绊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泳秀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一标沪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗜傅,春花似錦金句、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至偶房,卻和暖如春趁曼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棕洋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工挡闰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓摄悯,卻偏偏與公主長(zhǎng)得像赞季,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子射众,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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