From 34017d2c2ff4e6529e6621bbf75f54ed7dbbdd2a Mon Sep 17 00:00:00 2001 From: JZFamily Date: Sun, 24 Jun 2018 12:45:22 +0800 Subject: [PATCH] =?UTF-8?q?Update=2048=5F=E6=97=8B=E8=BD=AC=E5=9B=BE?= =?UTF-8?q?=E5=83=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LeetCode-CN/48_旋转图像.md | 100 +++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/LeetCode-CN/48_旋转图像.md b/LeetCode-CN/48_旋转图像.md index 39c53c1..0543f62 100644 --- a/LeetCode-CN/48_旋转图像.md +++ b/LeetCode-CN/48_旋转图像.md @@ -25,3 +25,103 @@ public: } }; ``` +### kiritow +* 4ms +```c++ +class Solution { +public: + void rotate(vector>& matrix) { + int n = matrix.size(); + if (n % 2) // odd number, easy + { + int mid = n / 2; + + for (int dis = 1; dis <= mid; dis++) + { + // do chain swap at distance:dis + int swap_n = 2 * dis + 1; + // save right col + vector tvec; + int begin_pos = mid - dis; + for (int i = 0; i < swap_n; i++) + { + tvec.push_back(matrix[begin_pos + i][mid + dis]); + } + // start rotate + // RIGHT <- UPPER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid + dis, mid - dis, begin_pos + i); + matrix[begin_pos + i][mid + dis] = matrix[mid - dis][begin_pos + i]; + } + // UPPER <- LEFT + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", mid - dis, begin_pos + i, begin_pos + i, mid - dis); + matrix[mid - dis][begin_pos + (swap_n - i - 1)] = matrix[begin_pos + i][mid - dis]; + } + // LEFT <- DOWNER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid - dis, mid + dis, begin_pos + i); + matrix[begin_pos + i][mid - dis] = matrix[mid + dis][begin_pos + i]; + } + // DOWNER <- TEMP + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-tvec[%d]\n", mid + dis, begin_pos + i, i); + matrix[mid + dis][begin_pos + (swap_n - i - 1)] = tvec[i]; + } + + // debug + //print(matrix); + } + } + else // oh, this stuff sucks. + { + int mid = n / 2 ; + + for (int dis = 1; dis <= mid ; dis++) + { + // do chain swap at distance:dis + int swap_n = 2 * dis; + // save right col + vector tvec; + int begin_pos = mid - dis; + for (int i = 0; i < swap_n; i++) + { + tvec.push_back(matrix[begin_pos + i][mid + dis - 1]); + } + // start rotate + // RIGHT <- UPPER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid + dis, mid - dis, begin_pos + i); + matrix[begin_pos + i][mid + dis - 1] = matrix[mid - dis][begin_pos + i]; + } + // UPPER <- LEFT + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", mid - dis, begin_pos + i, begin_pos + i, mid - dis); + matrix[mid - dis][begin_pos + (swap_n - i - 1)] = matrix[begin_pos + i][mid - dis]; + } + // LEFT <- DOWNER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid - dis, mid + dis, begin_pos + i); + matrix[begin_pos + i][mid - dis] = matrix[mid + dis -1][begin_pos + i]; + } + // DOWNER <- TEMP + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-tvec[%d]\n", mid + dis, begin_pos + i, i); + matrix[mid + dis -1][begin_pos + (swap_n - i - 1)] = tvec[i]; + } + + // debug + //print(matrix); + } + } + } +}; +```