LeetCode054 Spiral Matrix
来源:互联网 发布:红蚂蚁网络销售 编辑:程序博客网 时间:2024/06/05 12:42
详细见:leetcode.com/problems/spiral-matrix
Java Solution: github
package leetcode;import java.util.LinkedList;import java.util.List;public class P054_SpiralMatrix {public static void main(String[] args) {System.out.println(new Solution().spiralOrder(new int[][]{{1},{1},{1},{1}}));}/* * 最重要的是代码简洁,否则就是没用 * 1 ms * 2.73% */static class Solution {List<Integer> ans = new LinkedList<Integer>(); public List<Integer> spiralOrder(int[][] matrix) { int row = 0, col = 0, eni = 0; if (matrix == null || (row = matrix.length) == 0 || (col = matrix[0].length) == 0) return ans; eni = Math.min(row, col) >> 1; for (int i = 0; i != eni; i ++) fourEdge(i, row - 1 - i, col - 1 - i, matrix); if ((Math.min(row, col) & 0x1) == 1) { int rowi = Math.min(row, col) >> 1; int staj = rowi; int endj = Math.max(row, col) - rowi - 1; if (row < col) for (int j = staj; j <= endj; j ++) ans.add(matrix[rowi][j]); else for (int i = staj; i <= endj; i ++) ans.add(matrix[i][rowi]); } return ans; }private void fourEdge(int i, int j, int k, int[][] matrix) {int t = 0;for (t = i; t < k; t ++)ans.add(matrix[i][t]);for (t = i; t < j; t ++)ans.add(matrix[t][k]);for (t = k; t > i; t --)ans.add(matrix[j][t]);for (t = j; t > i; t --)ans.add(matrix[t][i]);}}}
C Solution: github
/* url: leetcode.com/problems/spiral-matrix/ AC 3ms 0.00%*/#include <stdio.h>#include <stdlib.h>void shell_add(int* ans, int* ai, int** m, int x1, int y1, int x2, int y2) { int x = 0, y = 0; for (y = y1; y < y2; y ++) ans[(*ai) ++] = m[x1][y]; for (x = x1; x < x2; x ++) ans[(*ai) ++] = m[x][y2]; for (y = y2; y > y1; y --) ans[(*ai) ++] = m[x2][y]; for (x = x2; x > x1; x --) ans[(*ai) ++] = m[x][y1];}int* spiralOrder(int** m, int rn, int cn) { int* ans = (int*) malloc(sizeof(int)*(rn*cn)); int ai = 0; int x1 = 0, y1 = 0, x2 = rn - 1, y2 = cn - 1; while (x1 < x2 && y1 < y2) { shell_add(ans, &ai, m, x1, y1, x2, y2); x1 ++; y1 ++; x2 --; y2 --; } if (x1 == x2) { while(y1 <= y2) ans[ai ++] = m[x1][y1++]; } else if (y1 == y2) { while (x1 <= x2) ans[ai ++] = m[x1++][y1]; } printf("ai is %d\r\n", ai); return ans;}int main() { int rn = 7, cn = 3; int** m = (int**) malloc(sizeof(int*)*rn); int m0[] = {1, 2, 3}; int m1[] = {4, 5, 6}; int m2[] = {7, 8, 9}; int m3[] = {10, 11, 12}; int m4[] = {13, 14, 15}; int m5[] = {16, 17, 18}; int m6[] = {19, 20, 21}; int* ans = NULL; int i = 0; m[0] = m0; m[1] = m1; m[2] = m2; m[3] = m3; m[4] = m4; m[5] = m5; m[6] = m6; ans = spiralOrder(m, rn, cn); for (i = 0; i < rn*cn; i ++) printf("%d ", ans[i]); printf("\r\n"); free(m);}
Python Solution: github
#coding=utf-8''' url: leetcode.com/problems/spiral-matrix @author: zxwtry @email: zxwtry@qq.com @date: 2017年4月10日 @details: Solution: 45ms 46.70%'''class Solution(object): def shell_add(self, a, ai, i1, j1, i2, j2, m): for k in range(j1, j2): a[ai[0]] = m[i1][k] ai[0] += 1 for k in range(i1 , i2): a[ai[0]] = m[k][j2] ai[0] += 1 for k in range(j2, j1, -1): a[ai[0]] = m[i2][k] ai[0] += 1 for k in range(i2, i1, -1): a[ai[0]] = m[k][j1] ai[0] += 1 def spiralOrder(self, m): """ :type m: List[List[int]] :rtype: List[int] """ mi = 0 if m == None else len(m) if mi == 0: return [] mj = 0 if m[0] == None else len(m[0]) if mj == 0: return [] i1, j1, i2, j2, ai, a = 0,0,mi-1,mj-1,[0],[0]*(mi*mj) while i1 < i2 and j1 < j2: self.shell_add(a, ai, i1, j1, i2, j2, m) i1, i2, j1, j2 = i1+1,i2-1,j1+1,j2-1 if i1 == i2: for k in range(j1, j2+1): a[ai[0]] = m[i1][k] ai[0] += 1 elif j1 == j2: for k in range(i1, i2+1): a[ai[0]] = m[k][j1] ai[0] += 1 return a
0 0
- LeetCode054 Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- Spiral Matrix
- iOS微信浏览器回退不刷新(监听浏览器回退事件)
- MySQL执行外部sql脚本文件的命令
- 数据结构之栈和队列
- C#操纵Excel-利用NPOI库
- Tensorflow的可视化操作
- LeetCode054 Spiral Matrix
- L1-027. 出租 java
- [BZOJ2844]albus就是要第一个出场 高斯消元+线性基
- 多线程客户端跟服务器
- HTTP协议学习笔记三
- IntelliJ IDEA 2016注册方法和注册码
- LintCode 翻转二叉树
- MySQL获取当前日期的前一个月的最后一天
- 树莓派上的软件安装和卸载命令汇总