螺旋矩阵旋转法php,LeetCode54. 螺旋矩阵&LeetCode59.螺旋矩阵 II&LeetCode48. 旋转图像...

f8360f6d94a725291c0f29627b8285dc.png

题解

要是去找每次移动下标之间的关系就错了,很难找到,应该从宏观角度去看,首先打印的是最外层一圈,然后打印倒数第二层的一圈,...依次下去,所以应该这么做,找到最左上角的坐标(lx,ly)和最右下角的坐标(rx,ry),让lx加加直到lx=rx,然后让ly加加直到ly=ry,再让rx减减直到rx=lx,最后ry减减直到ry=ly,完了以后将lx,ly加加,rx,ry减减,这样就到了内一层,继续执行旋转,直到rx

代码class Solution {

List res = new ArrayList();

public List spiralOrder(int[][] matrix) {

res.clear();

if(matrix.length == 0)

return res;

int lx = 0,ly = 0;

int rx = matrix[0].length - 1,ry = matrix.length - 1;

while(lx <= rx && ly <= ry) {

dfs(matrix,lx++,ly++,rx--,ry--);

}

return res;

}

public void dfs(int[][] arr,int lx,int ly,int rx,int ry) {

if(ly == ry)

while(lx <= rx)

res.add(arr[ly][lx++]);

else if(lx == rx)

while(ly <= ry)

res.add(arr[ly++][lx]);

else {

int curx = lx,cury = ly;

while(curx < rx)

res.add(arr[cury][curx++]);

while(cury < ry)

res.add(arr[cury++][rx]);

while(rx > lx)

res.add(arr[ry][rx--]);

while(ry > ly)

res.add(arr[ry--][lx]);

}

}

}

85fa54fb923e783a5714733636c07510.png

代码class Solution {

static int num;

public int[][] generateMatrix(int n) {

num = 1;

int[][] res = new int[n][n];

if(n == 0)

return res;

if(n == 1) {

res[0][0] = 1;

return res;

}

int lx = 0,ly = 0;

int rx = n - 1,ry = n - 1;

while(lx <= rx && ly <= ry) {

dfs(res,lx++,ly++,rx--,ry--);

}

if(n %2 != 0)

res[n / 2][n / 2] = num;

return res;

}

public void dfs(int[][] res,int lx,int ly,int rx,int ry) {

int curx = lx,cury = ly;

while(curx < rx)

res[cury][curx++] = num++;

while(cury < ry)

res[cury++][rx] = num++;

while(rx > lx)

res[ry][rx--] = num++;

while(ry > ly)

res[ry--][lx] = num++;

}

}

8250df60dd3ea5eb4c340468d406581f.png

题解

这三道题几乎都是相同类型的题目,都是跟矩阵旋转有关,说一下这道题的思路,首先获取四个角上的元素,arr[0][0],arr[0][n-1],arr[n-1][n-1],arr[n-1][0],将这四个值进行轮换,对应下图画黑圈的值,然后再换画红圈的值,最后绿圈,最外层完了以后进入内层。

85b66b99e5ceb28d1a0230db64546a5c.png

代码class Solution {

public void rotate(int[][] matrix) {

int lx = 0,ly = 0;

int rx = matrix.length - 1,ry = matrix[0].length - 1;

while(lx <= rx && ly <= ry) {

dfs(matrix,lx++,ly++,rx--,ry--);

}

}

public void dfs(int[][] arr,int lx,int ly,int rx,int ry) {

int times = rx - lx;

for(int i = 0;i < times;i++) {

int t = arr[lx][ly + i];

arr[lx][ly + i] = arr[rx - i][ly];

arr[rx - i][ly] = arr[rx][ry - i];

arr[rx][ry - i] = arr[lx + i][ry];

arr[lx + i][ry] = t;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值