<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 0048. 旋轉圖像 ## 題目地址(48. 旋轉圖像) <https://leetcode-cn.com/problems/rotate-image/> ## 題目描述 ``` <pre class="calibre18">``` 給定一個 n × n 的二維矩陣表示一個圖像。 將圖像順時針旋轉 90 度。 說明: 你必須在原地旋轉圖像,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉圖像。 示例 1: 給定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋轉輸入矩陣,使其變為: [ [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] ], 原地旋轉輸入矩陣,使其變為: [ [15,13, 2, 5], [14, 3, 4, 1], [12, 6, 8, 9], [16, 7,10,11] ] ``` ``` ## 前置知識 - 原地算法 - 矩陣 ## 公司 - 阿里 - 騰訊 - 百度 - 字節 ## 思路 這道題目讓我們 in-place,也就說空間復雜度要求 O(1),如果沒有這個限制的話,很簡單。 通過觀察發現,我們只需要將第 i 行變成第 n - i - 1 列, 因此我們只需要保存一個原有矩陣,然后按照這個規律一個個更新即可。 ![](https://img.kancloud.cn/af/cc/afcc1250e8c622deb4fc26bb8dc7df37_828x289.jpg) 代碼: ``` <pre class="calibre18">``` <span class="hljs-keyword">var</span> rotate = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">matrix</span>) </span>{ <span class="hljs-title">// 時間復雜度O(n^2) 空間復雜度O(n)</span> <span class="hljs-keyword">const</span> oMatrix = <span class="hljs-params">JSON</span>.parse(<span class="hljs-params">JSON</span>.stringify(matrix)); <span class="hljs-title">// clone</span> <span class="hljs-keyword">const</span> n = oMatrix.length; <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-params">0</span>; i < n; i++) { <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> j = <span class="hljs-params">0</span>; j < n; j++) { matrix[j][n - i - <span class="hljs-params">1</span>] = oMatrix[i][j]; } } }; ``` ``` 如果要求空間復雜度是 O(1)的話,我們可以用一個 temp 記錄即可,這個時候就不能逐個遍歷了。 比如遍歷到 1 的時候,我們把 1 存到 temp,然后更新 1 的值為 7。 1 被換到了 3 的位置,我們再將 3 存到 temp,依次類推。 但是這種解法寫起來比較麻煩,這里我就不寫了。 事實上有一個更加巧妙的做法,我們可以巧妙地利用對稱軸旋轉達到我們的目的,如圖,我們先進行一次以對角線為軸的翻轉,然后 再進行一次以水平軸心線為軸的翻轉即可。 ![](https://img.kancloud.cn/26/86/268639071c499e4b47fa5541a6fe2702_826x374.jpg) 這種做法的時間復雜度是 O(n^2) ,空間復雜度是 O(1) ## 關鍵點解析 - 矩陣旋轉操作 ## 代碼 - 語言支持: Javascript,Python3 ``` <pre class="calibre18">``` <span class="hljs-title">/* * @lc app=leetcode id=48 lang=javascript * * [48] Rotate Image */</span> <span class="hljs-title">/** * @param {number[][]} matrix * @return {void} Do not return anything, modify matrix in-place instead. */</span> <span class="hljs-keyword">var</span> rotate = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">matrix</span>) </span>{ <span class="hljs-title">// 時間復雜度O(n^2) 空間復雜度O(1)</span> <span class="hljs-title">// 做法: 先沿著對角線翻轉,然后沿著水平線翻轉</span> <span class="hljs-keyword">const</span> n = matrix.length; <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">swap</span>(<span class="hljs-params">arr, [i, j], [m, n]</span>) </span>{ <span class="hljs-keyword">const</span> temp = arr[i][j]; arr[i][j] = arr[m][n]; arr[m][n] = temp; } <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-params">0</span>; i < n - <span class="hljs-params">1</span>; i++) { <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> j = <span class="hljs-params">0</span>; j < n - i; j++) { swap(matrix, [i, j], [n - j - <span class="hljs-params">1</span>, n - i - <span class="hljs-params">1</span>]); } } <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-params">0</span>; i < n / <span class="hljs-params">2</span>; i++) { <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> j = <span class="hljs-params">0</span>; j < n; j++) { swap(matrix, [i, j], [n - i - <span class="hljs-params">1</span>, j]); } } }; ``` ``` Python3 Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Solution</span>:</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">rotate</span><span class="hljs-params">(self, matrix: List[List[int]])</span> -> <span class="hljs-keyword">None</span>:</span> <span class="hljs-string">""" Do not return anything, modify matrix in-place instead. 先做矩陣轉置(即沿著對角線翻轉),然后每個列表翻轉; """</span> n = len(matrix) <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(n): <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> range(i, n): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] <span class="hljs-keyword">for</span> m <span class="hljs-keyword">in</span> matrix: m.reverse() <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">rotate2</span><span class="hljs-params">(self, matrix: List[List[int]])</span> -> <span class="hljs-keyword">None</span>:</span> <span class="hljs-string">""" Do not return anything, modify matrix in-place instead. 通過內置函數zip,可以簡單實現矩陣轉置,下面的代碼等于先整體翻轉,后轉置; 不過這種寫法的空間復雜度其實是O(n); """</span> matrix[:] = map(list, zip(*matrix[::<span class="hljs-params">-1</span>])) ``` ``` **復雜度分析** - 時間復雜度:O(M?N)O(M \* N)O(M?N) - 空間復雜度:O(1)O(1)O(1) 大家對此有何看法,歡迎給我留言,我有時間都會一一查看回答。更多算法套路可以訪問我的 LeetCode 題解倉庫:<https://github.com/azl397985856/leetcode> 。 目前已經 37K star 啦。 大家也可以關注我的公眾號《力扣加加》帶你啃下算法這塊硬骨頭。 ![](https://img.kancloud.cn/cf/0f/cf0fc0dd21e94b443dd8bca6cc15b34b_900x500.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看