<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實戰(zhàn)48:旋轉(zhuǎn)圖像

          共 2224字,需瀏覽 5分鐘

           ·

          2020-09-26 14:03

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做?旋轉(zhuǎn)圖像,我們先來看題面:

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

          You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise).


          You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.

          題意

          你必須在原地旋轉(zhuǎn)圖像,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉(zhuǎn)圖像。

          樣例

          示例 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]
          ]

          我們來看兩個動態(tài)圖:

          題解

          https://www.cnblogs.com/techflow/p/12687271.html

          這個動圖一看就明白了,也就是說我們需要將一個二維矩陣順時針旋轉(zhuǎn)90度。這個題意我們都很好理解,但是題目當(dāng)中還有一個限制條件:我們不能額外申請其他的數(shù)組來輔助,也就是對我們的空間利用進(jìn)行了限制。

          如果沒有這個條件限制其實很容易,我們只需要算出每一個坐標(biāo)旋轉(zhuǎn)之后的位置,我們重新創(chuàng)建一個數(shù)組然后依次填充就行了。

          我們忽略矩陣當(dāng)中具體的數(shù)據(jù),而來看看矩陣旋轉(zhuǎn)前后的坐標(biāo)變化。這是矩陣旋轉(zhuǎn)之前的坐標(biāo):

          旋轉(zhuǎn)之后,坐標(biāo)變成了:

          我們對照上面兩張圖觀察一下,可以看出對于坐標(biāo)(i, j)來說,它旋轉(zhuǎn)90度之后得到的結(jié)果應(yīng)該是(j, n-1-i)。這里的n是行數(shù)。

          我們有了這個式子之后,我們可以繼續(xù)推廣。我們發(fā)現(xiàn)(i, j)位置的點旋轉(zhuǎn)之后到了(j, n-1-i)。而(j, n-1-i)位置的點旋轉(zhuǎn)之后到了(n-1-i, n-1-j),同理(n-1-i, n-1-j)旋轉(zhuǎn)之后到了(n-1-j, i),最后我們發(fā)現(xiàn)(n-1-j, i)旋轉(zhuǎn)之后回到了(i, j)。

          也就是說對于一次旋轉(zhuǎn)來說,(i, j), (j,n-1-i), (n-1-i, n-1-j), (n-1-j, i)這四個位置的元素互相交換了位置,并沒有影響到其他位置。其實這個也是很容易想明白的,因為題目給定的是一個方陣。

          我們看下下圖就理解了:

          也就是說我們只需要遍歷矩陣四分之一的部分,然后通過坐標(biāo)拿到互相交換的4個位置,然后交換它們的元素即可。

          代碼

          代碼真的很簡單,只有幾行:

          class?Solution:
          ????def?rotate(self,?matrix:?List[List[int]])?->?None:
          ????????"""
          ????????Do?not?return?anything,?modify?matrix?in-place?instead.
          ????????"""

          ????????n?=?len(matrix)
          ????????
          ????????#?注意一下范圍和下標(biāo)即可
          ????????for?i?in?range(n//2):
          ????????????for?j?in?range(i,?n-1-i):
          ????????????????matrix[i][j],?matrix[j][n-1-i],?matrix[n-1-i][n-1-j],?matrix[n-1-j][i]?=?\
          ????????????????matrix[n-1-j][i],?matrix[i][j],?matrix[j][n-1-i],?matrix[n-1-i][n-1-j]
          好了,今天的文章就到這里,如果覺得有所收獲,請順手點個在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動力。


          上期推文:


          LeetCode1-20題匯總,速度收藏!
          LeetCode21-40題匯總,速度收藏!
          LeetCode刷題實戰(zhàn)40:組合總和 II
          LeetCode刷題實戰(zhàn)41:缺失的第一個正數(shù)
          LeetCode刷題實戰(zhàn)42:接雨水
          LeetCode刷題實戰(zhàn)43:字符串相乘
          LeetCode刷題實戰(zhàn)44:通配符匹配
          LeetCode刷題實戰(zhàn)45:跳躍游戲 II
          LeetCode刷題實戰(zhàn)46:全排列
          LeetCode刷題實戰(zhàn)47:全排列 II


          瀏覽 28
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品国产三级国产 | 欧美波多野结衣 | 国内免费毛片一区二区 | 大肉大捧一进一出两腿 | 青娱乐自拍视频 |