leetcode----面試題 01.07. 旋轉矩陣

題目鏈接--------------->leetcode----面試題 01.07. 旋轉矩陣

這個題只要我們自己手動模擬一邊旋轉過程,很容易就找出規律來。

方法一:對於一個num[i][j]num[i][j]來說它旋轉後的位置爲num[j][n1i]num[j][n-1-i],我們使用一個數組來保存原數組的值,然後雙重循環對原數組賦值即可。

void rotate(vector<vector<int>>& matrix) {
    int n = matrix.size(),m = matrix[0].size();
    vector<vector<int>> num(matrix.begin(),matrix.end());
    for(int i = 0;i < n;i++)
    {
        for(int j = 0;j < m;j++)
        {
            matrix[j][n - 1 - i] = num[i][j];
        }
    }
}

方法二:上述方法要使用額外數組,是因爲在轉換的過程中會把目標位置的數給覆蓋掉,所以要使用一個數組來保存它們的值。其實完全沒必要多用一個數組,我們可以看下述例子

假設我們即將要旋轉的數字爲num[i][j]num[i][j]

1.num[i][j]num[i][j]被旋轉到的位置爲num[j][n1i]num[j][n-1-i]

2.num[j][n1i]num[j][n-1-i]被旋轉到的位置爲num[n1i][n1j]num[n-1-i][n-1-j]

3.num[n1i][n1j]num[n-1-i][n-1-j]被旋轉到的位置爲num[n1j][i]num[n-1-j][i]

4.num[n1j][i]num[n-1-j][i]被旋轉到的位置爲num[i][j]num[i][j]

我們可以發現這是一個閉環,所以在對一個數字旋轉時,爲了避免目標位置的數字被覆蓋我們可以一次將這四個數全部都旋轉。此時我們並不需要一個二維數組,而只需要一個變量

由於我們一次需要操作便可旋轉4個數,所以我們要確定枚舉的邊界。我們對於一個需要旋轉的二維數組通過上述方法來模擬一遍,很容易就找到邊界。
第一層的邊界爲n/2n/2,第二層的邊界爲n1in-1-i

void rotate(vector<vector<int>>& matrix) {
    int n = matrix.size();
    for(int i = 0;i < n/2;i++)
    {
        for(int j = i;j < n - 1 - i;j++)
        {
            int tmp = matrix[j][n - 1 - i];
            matrix[j][n - 1 - i] = matrix[i][j];
            matrix[i][j] = matrix[n - 1 - j][i];
            matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
            matrix[n - 1 - i][n - 1 - j] = tmp;
        }
    }
}

看了題解後發現還有一種更好的做法

方法三:我們對二維數組先水平翻轉,然後再按主對角線翻轉。

水平翻轉:num[n1i][j]=num[i][j]num[n-1-i][j]=num[i][j],主對角線反轉:num[j][i]=num[i][j]num[j][i]=num[i][j]

將上面兩個式子合併可得到num[j][n1i]=num[i][j]num[j][n-1-i]=num[i][j],可以看出這正是我們方法一中的式子。

void rotate(vector<vector<int>>& matrix) {
    int n = matrix.size();
    for(int i = 0;i < n/2;i++)
    {
        for(int j = 0;j < n;j++)
        {
            swap(matrix[i][j],matrix[n - 1 - i][j]);
        }
    }
    for(int i = 0;i < n;i++)
    {
        for(int j = i;j < n;j++)
            swap(matrix[i][j],matrix[j][i]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章