灵活操作多维矩阵

今天这一题是“贪吃蛇”:

给定一个NxN矩阵,从[0][0]开始沿顺时针方向遍历所有元素。如:

1 2 3

8 9 4

7 6 5

这样一个矩阵,最终的遍历打印输出为 1 2 3 4 5 6 7 8 9。

如何做到呢?

这个遍历其实是不断打印某个矩阵的四条边。老老实实的研究出各条边的起止index规律然后打印出来诚然可以,但是还有一个更简单的方法:

继续观察:

1. 打印第一条边 1 2 3,实际上是原始矩阵的第一行。

2. 接下来打印的第二条边 4 5, 是矩阵:

4 5

9 6

8 7

的第一行。而这个矩阵,是去掉第一条边后剩下的矩阵:

8 9 4

7 6 5

的转置矩阵的按行倒序。

3. 第三条边 6 7,是矩阵:

6 7

9 8

的第一行。这个矩阵,又是去掉第二条边后剩下的矩阵:

9 6

8 7

的转置矩阵的按行倒序。

4. 依次类推…

实现要点:

1. 去掉多维矩阵的第一行:

用list.pop()。

2. 矩阵的转置:

用zip(*原矩阵)。

3. 矩阵的按行倒序:

用list.reverse()。

相应的代码为:

def snail(array):
    a = []
    while array:
        a.extend(list(array.pop(0)))
        array = zip(*array)
        array.reverse()
    return a

zip和list真是矩阵处理的好帮手。

时间: 2024-10-17 18:31:16

灵活操作多维矩阵的相关文章

matlab_矩阵的灵活操作

矩阵的随心所欲的世界: 矩阵的生成[创建] 矩阵的扩充 矩阵的操作[访问.赋值.删减.变向.抽取] 矩阵的分块[划分子集] 1. 矩阵的生成 使用          功能1) 特殊字符 [ ]   直接输入构造数组2) zeros()函数   构造全0数组 2. 矩阵的扩充 使用 特殊字符 [ ]Example: 原矩阵A,需要扩充的元素B,CD = [A,B,C] 扩充列D = [A;B,C] 扩充行...[扩充符合矩阵的大小性质均可] 错误操作: A = [1,2] B = [1;2] C

卷积操作转化成矩阵乘法

参考:https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/ 平常都是无脑使用Pytorch提供的nn.Conv2d方法,但是并不关心具体该如何实现,原来是把卷积操作转化成矩阵乘法,而不是真的通过滑动卷积核来做卷积,下面做具体介绍. 首先看一下下面的示意图,左边是输入图像,右边是卷积核(为方便说明,只用了一个卷积核). 下面是用这个卷积核对输入图像做卷积操作,最后得到一个2维的平面 由下图可以看到卷

对于时间的灵活操作

import java.util.*; class  Demo3 { public static void main(String[] args)  { Calendar c=Calendar.getInstance(); //c.set(2012,4,23);      //可以设置当前的时间 c.add(Calendar.MONTH,-7); //往前推7个月   c.add(Calendar.YEAR,-1);//往前推一年  printCalendar(c); } public stat

lintcode 容易题:Search a 2D Matrix 搜索二维矩阵

题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 给出 target = 3,返回 true 挑战 O(log(n) + log(m)) 时间复杂度 解题: 1.最简单的方法就是遍历整个矩阵,时间复杂度:O(log(mn)),这个应该等于O(long(

二维矩阵卷积运算实现

http://z.download.csdn.net/detail/wangfei0117/4408649 http://download.csdn.net/detail/wanwenliang2008/1767686 二维矩阵卷积运算实现,布布扣,bubuko.com

poj3735—Training little cats(特殊操作转化为矩阵操作)

题目链接:http://poj.org/problem?id=3735 题目意思: 调教猫咪:有n只饥渴的猫咪,现有一组羞耻连续操作,由k个操作组成,全部选自: 1. g i 给第i只猫咪一颗花生 2. e i 让第i只猫咪吃光它的花生 3. s i j 交换猫咪i与猫咪j的花生 现将上述一组连续操作做m次后,求每只猫咪有多少颗花生? 思路:这道题难点在如何把这种奇怪的操作转化为矩阵操作,网络上看到一个画的很好的图,这里直接偷过来. 现在,对于每一个操作我们都可以得到一个转置矩阵,把k个操作的矩

lintcode 中等题:search a 2d matrix II 搜索二维矩阵II

题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复的整数. 样例 考虑下列矩阵: [     [1, 3, 5, 7],     [2, 4, 7, 8],     [3, 5, 9, 10] ] 给出target = 3,返回 2 挑战 要求O(m+n) 时间复杂度和O(1) 额外空间 解题 直接遍历,时间复杂度是O(MN) public

CUDA学习之一:二维矩阵加法

今天忙活了3个小时,竟然被一个苦恼的CUDA小例程给困住了,本来是参照Rachal zhang大神的CUDA学习笔记来一个模仿,结果却自己给自己糊里糊涂,最后还是弄明白了一些. RZ大神对CUDA关于kernel,memory的介绍还是蛮清楚,看完决定写一个二维数组的加法.如果是C++里的加法,那就简单了,用C[i][j] = A[i][j] +B[i][j]就可以. 1 void CppMatAdd(int A[M][N],int B[M][N],int C[M][N]){ 2 for(int

20140920百度笔试题一道之二维矩阵查找

题目: 有这样一个二维矩阵A[N][N],满足j < k时, 1)a[i][j] < a[i][k]; 2)a[j][i] < a[k][i](其实就数据从左上角到右下角纵横方向上都递减),给定一个数target,如何快速搜索是否在这个矩阵中,是的话输出二维坐标,否则输出Null:(不妨假设数据不重复) 比如  12  34  56  78  90  96 13  35  57  79  91  97 14  36  58  80  93  98 15  37  59  81  94