查看: 3165| 回复: 21
跳转到指定楼层
上一主题 下一主题
收起左侧

旋转一个N*N的矩阵,不准开辟新空间

🔗
MTC | 只看该作者 |倒序浏览
全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
有没有什么好方法?逐层向里那个我感觉有点难理解,很难面试的时候立马写出来

上一篇:python有的题一定要时间最优解,不然都过不了
下一篇:刚下了dommy的leetcode,但是java文件里面中文注释是乱码
推荐
daihao0310 2014-11-5 23:14:31 | 只看该作者
全局:
建议楼主可以看一下Cracking the Code Interview这本书,上面对这道题有比较详细的算法描述。
回复

使用道具 举报

推荐
南若冲 2014-11-7 16:55:37 | 只看该作者
全局:
给个C++的
T为0时表示左右翻转,为1时表示上下翻转。

#include <iostream>
using namespace std;

int main ()
{
        int A[201][201];
        int M, N, T;
        cin >> M >> N >>T;
        for (int i = 0; i < M; i++)
        {
                for (int j = 0; j < N; j++)
                        cin >> A[i][j];
        }
        if ( T == 1)
        {
                for (int i = M - 1; i >= 0; i--)
                {
                        for (int j = 0; j < N; j++)
                                cout << A[i][j] << ' ';       
                        cout << endl;
                }
        }
        else
        {
                for (int i = 0; i < M; i++)
                {
                        for (int j = N -1 ; j >= 0; j--)
                                cout << A[i][j] << ' ';               
                        cout << endl;
                }
        }
        //while (1);
        return 0;
}






回复

使用道具 举报

推荐
ysyyork 2014-11-6 10:23:14 | 只看该作者
全局:
MTC 发表于 2014-11-6 09:41
能给个详细的link或者code吗?

public void rotate(int[][] matrix) {
        //先对角线翻转一次,在沿中线翻转
        int len = matrix.length;
        for (int i = 0; i < len; i++)
            for (int j = 0; j < len - i; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[len-1-j][len-1-i];
                matrix[len-1-j][len-1-i] = temp;
            }
        
        for (int i = 0; i < len / 2; i++)
            for (int j = 0; j < len; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[len-1-i][j];
                matrix[len-1-i][j] = temp;
            }
    }

行的中线。如果你有3行——0,1,2——那就是行1
回复

使用道具 举报

🔗
zombiecry 2014-11-5 21:56:25 | 只看该作者
全局:
本帖最后由 zombiecry 于 2014-11-5 21:57 编辑

是LeetCode上面那个旋转90度的题目吗?
我的方法很好理解:
旋转90度的结果跟求转置很像。区别是第一行变成最后一列而不是第一列。
所以可以先给这个矩阵转置。然后把前n/2列逐次和后n/2列交换就行了。
回复

使用道具 举报

🔗
 楼主| MTC 2014-11-5 22:09:27 | 只看该作者
全局:
zombiecry 发表于 2014-11-5 21:56
是LeetCode上面那个旋转90度的题目吗?
我的方法很好理解:
旋转90度的结果跟求转置很像。区别是第一行变 ...

对,就是那道,大牛贴一下code吧
回复

使用道具 举报

🔗
kelvinzhong 2014-11-6 00:38:10 | 只看该作者
全局:
不开辟新空间能做到? 起码也要有一个O(1)的新空间吧, swap的时候不用一个变量,怎么swap?
回复

使用道具 举报

🔗
evensong 2014-11-6 01:03:46 | 只看该作者
全局:
如果连循环时候的变量都不能设立,我也没着了。
不然,可以用异或交换两个变量,这样不用开辟额外空间。
异或交换之前,要判断当前行和列是否相等,以及值是否相等。
回复

使用道具 举报

🔗
ysyyork 2014-11-6 01:17:34 | 只看该作者
全局:
本帖最后由 ysyyork 于 2014-11-6 01:18 编辑

先沿西南到东北的对角线翻转一次,在沿垂直中线翻转一次
回复

使用道具 举报

🔗
 楼主| MTC 2014-11-6 09:41:45 | 只看该作者
全局:
ysyyork 发表于 2014-11-6 01:17
先沿西南到东北的对角线翻转一次,在沿垂直中线翻转一次

能给个详细的link或者code吗?
回复

使用道具 举报

🔗
 楼主| MTC 2014-11-6 09:47:44 | 只看该作者
全局:
ysyyork 发表于 2014-11-6 01:17
先沿西南到东北的对角线翻转一次,在沿垂直中线翻转一次

垂直中线是哪一条?
回复

使用道具 举报

🔗
 楼主| MTC 2014-11-6 09:54:11 | 只看该作者
全局:
evensong 发表于 2014-11-6 01:03
如果连循环时候的变量都不能设立,我也没着了。
不然,可以用异或交换两个变量,这样不用开辟额外空间。
...

可以交换的,能详细点说吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表