当前位置: 首页 > news >正文

LeetCode -- SpiralOrder

题目描述:


Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.


For example,
Given the following matrix:


[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].


从例子可以看出,需要做的是从矩阵的第一个元素为起始,沿外环向内依次遍历,最后打印出结果。


思路:
获取矩阵的长宽,设需要走n圈,则n = Min(宽度,高度)/2。
从左上节点为起始开始遍历,走到最右的最后一个元素开始向下走,走到最后向左走,最后向上走。走了一圈,需要把坐标往内+1。
需要考虑刚好处于矩阵中间线的情况。


实现代码:






public class Solution {
    public IList<int> SpiralOrder(int[,] matrix) {
   if(matrix == null){
		return new List<int>();		
	}
	
	var result = new List<int>();
	
	var rowLen = matrix.GetLength(0);
	var len = matrix.GetLength(1);
	
	if(rowLen == 1){
		for(var i =0 ;i < len; i++){
			result.Add(matrix[0,i]);
		}
		return result;
	}
	if(len == 1){
		for(var i =0 ;i < rowLen; i++){
			result.Add(matrix[i,0]);
		}
		return result;
	}
	
	var minLen = Math.Min(rowLen,len);
	var cycleCount = minLen % 2 == 0 ? minLen/2 : (minLen + 1) / 2;
	var c = 0;
	
	for(var i = 0;i < cycleCount; i++){
		if(c == len-c-1){
			for(var k = c;k < rowLen - c; k++){
				result.Add(matrix[k, c]);	
			}
			
			c++;
			continue;
		}
		
		// stick row to top, column : [c,len-c-1]
		for(var top = c; top < len-c - 1; top++){
			result.Add(matrix[c,top]);
		}
		
		// stick column to right, row : [c,rowLen-c-1]
		for(var right = c; right < rowLen-c - 1; right ++){
			result.Add(matrix[right, len-c-1]);
		}
		
		// stick row to bottom, column : [len-c-1, c]
		for(var down = len-c -1; down > c; down --){
			result.Add(matrix[rowLen-c-1, down]);
		}
		
		// stick column to left, row : [len-c-1, c]
		for(var left = rowLen-c - 1; left > c; left --){
			result.Add(matrix[left, c]);
		}
		
		c++;
	}
	
	return result;
    }
    


 
}


相关文章:

  • Windows 2003下成功配置IIS+Php+Mysql+Zend Optimizer+GD库+Phpmyadmin
  • LeetCode -- WordBreak II
  • Azure 证书配置错误: The service configuration file does not provide the certificate identification
  • Linux精彩一句话最新版
  • LeetCode -- Count Complete Tree Node
  • LeetCode -- Isomorphic Strings
  • LeetCode -- Balanced Binary Tree
  • Linux系统信息查看命令大全
  • LeetCode -- Merge Two sorted lists
  • 汇编语言程序设计的基本方法
  • LeetCode -- Binary Tree Zigzag Level Order Traversal
  • PostgreSQL+PostGIS的使用 1
  • LeetCode -- Compare Version Numbers
  • LeetCode -- Implement Queue using Stacks
  • PostgreSQL+PostGIS的使用 2
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 3.7、@ResponseBody 和 @RestController
  • HTML-表单
  • HTTP请求重发
  • MobX
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 观察者模式实现非直接耦合
  • 将回调地狱按在地上摩擦的Promise
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何实现 font-size 的响应式
  • 山寨一个 Promise
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微信开放平台全网发布【失败】的几点排查方法
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一起参Ember.js讨论、问答社区。
  • 再谈express与koa的对比
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 2017年360最后一道编程题
  • Nginx实现动静分离
  • ( 10 )MySQL中的外键
  • (二开)Flink 修改源码拓展 SQL 语法
  • (剑指Offer)面试题34:丑数
  • (篇九)MySQL常用内置函数
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)EOS中账户、钱包和密钥的关系
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .Family_物联网
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET基础篇——反射的奥妙
  • .NET框架
  • .Net中间语言BeforeFieldInit
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @vue/cli脚手架
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ C++ ] STL---string类的使用指南
  • [1204 寻找子串位置] 解题报告
  • [20140403]查询是否产生日志
  • [20150904]exp slow.txt