使用一个额外变量解决”请用最少的额外空间将一个M*N的矩阵旋转90度“
来源:互联网 发布:幕府将军2优化补丁 编辑:程序博客网 时间:2024/06/05 07:35
本题以逆时针为例
对于这个转换问题的关键是需要明确转换的公式,这里有两个公式可以进行变换,例如对于M*N的矩阵A[M][N],旋转后得到B[N][M]
1.按照顺序查看A变换后的位置这种思路可以得到:A[i][j] = B[N - j - 1][i]
2. 按照顺序查看变换后的数值在A中的位置这种思路可以得到:B[i][j] = A[j][N - i - 1]
如果考虑这两点,则可以使用M*N的额外空间申请与之前数组一样大小的空间进行赋值操作即可(对于一维数组可以按照A[i / N][i % N]转换成二维数组操作)
#include <stdio.h>
#define M 5
#define N 10
int main(){
int test[M*N];
int temp[M * N];
int i = 0, k = 0;
for(i = 0; i < M * N; i++){
test[i] = i;
if (i % N == 0)
printf("\n");
printf("%10d", test[i]);
}
printf("\n a M*N memory exchange:\n");
for(i = 0; i < M * N; i++){
//temp[(N - i % N - 1) * M + i / N] = test[i];
temp[i] = (i % M) * N + N - i / M - 1;
}
for(i = 0; i < M * N; i++){
if (i % M == 0)
printf("\n");
printf("%10d", temp[i]);
}
printf("\n");
}
但是这样的额外空间为M*N,肯定不是理想的情况;
基于上面的实现,我们可以考虑是否可以在赋值时,将赋值操作变换成互换操作,这样就可以使用一个额外空间
但是如果变为互换又会出现新的问题,即互换以后如何能够在接下来需要这个数据时正确索引;
通过分析,我们可以发现,如果按照旋转之后的顺序进行存储时,如果与当前位置互换的位置大于目前操作的位置,则互换位置没有被更新过,直接互换就行;反之,则被之前的互换操作替换过,而替换到的位置就是互换的公式位置,这样继续查找直到找到大于目前操作的位置,然后将此位置的数据与当前位置的数据进行互换;
for(i = 0; i < M * N; i++){
k = (i % M) * N + N - i / M - 1;
while(k < i){
k = (k % M) * N + N - k / M - 1;
}
value = test[i];
test[i] = test[k];
test[k] = value;
}
这样就实现了只使用一个额外空间就达到矩阵旋转90度的效果
- 使用一个额外变量解决”请用最少的额外空间将一个M*N的矩阵旋转90度“
- 数组字符串系列之,将矩阵逆时针旋转90度,要求使用最少的额外空间
- 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转
- 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。
- 解释“用最小空间度将一个M*N的矩阵旋转90度(顺逆时针均可) ”
- 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)
- Rotate Image 矩阵旋转90度,没有额外空间
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- 将M*N的矩阵旋转90度
- 将M*N的矩阵旋转90度
- 将栈S中的元素逆置,使用额外的一个栈L和非数组变量
- 【C++】判断一个数是不是回文数,不使用额外的空间
- [每日练习]数组有N+M个数字, 数字的范围为1 ... N, 打印重复的元素, 要求O(M + N), 不可以用额外的空间
- 将一个字符串不使用额外容器向左移动M位
- 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。 给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的
- 原串翻转 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。 给定一个string iniString,请返回一个string,为翻转后的字符串
- 不使用额外的数据结构,逆序一个栈
- 有两个有序的单链表,将它们合并为一个有序的单链表,不允许分配额外空间
- 奋战杭电ACM(DAY11)1016
- 【代码】Android: SMS TEL MAIL 发送短信、打电话、发送邮件使用集合
- 编程中的双缓冲技术
- mysql 修改 wait_timeout
- 黑马程序员 .NET学习笔记 <7>
- 使用一个额外变量解决”请用最少的额外空间将一个M*N的矩阵旋转90度“
- 10424 - Love Calculator
- HDU 1312 Red and Black
- Javascript this 解析
- android 关于按钮的performclick()方法失效的问题
- Selenium_Java实例代码(1)
- MYSQL-- 每半月一个分区,自动维护
- Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
- GDI+从资源文件中加载图片