O(1)空间内实现矩阵转置
来源:互联网 发布:休闲游戏推荐 知乎 编辑:程序博客网 时间:2024/06/03 04:01
思路:
* 每个元素转置前后会形成一个环(一个数字有多个环)
* 利用环来移动元素达到转置
* 关键:
* 1.得到元素下标的前驱后继,
* 2.判断环是否已走过(意味属于一个环的元素一次转置完成)
* 解决:
* 1.从一维下标转二维坐标得到转置后的二维坐标再换回一维坐标
* 如:M*N矩阵
* 假设转置前某个元素的数组下标为i,则它所在行列为(i/N, i%N),
* 转置后所在行列则为(i%N, i/N),可计算转置后数组下标为(i%N)*M+i/N,
* 此为i的后继。假设转置后某个元素的数组下标为i,则它所在行列为(i/M, i%M),
* 则转置前所在行列为(i%M, i/M),可计算此时下标为(i%M)*N+i/M,此为i的前驱。
*
* 每个元素转置前后会形成一个环(一个数字有多个环)
* 利用环来移动元素达到转置
* 关键:
* 1.得到元素下标的前驱后继,
* 2.判断环是否已走过(意味属于一个环的元素一次转置完成)
* 解决:
* 1.从一维下标转二维坐标得到转置后的二维坐标再换回一维坐标
* 如:M*N矩阵
* 假设转置前某个元素的数组下标为i,则它所在行列为(i/N, i%N),
* 转置后所在行列则为(i%N, i/N),可计算转置后数组下标为(i%N)*M+i/N,
* 此为i的后继。假设转置后某个元素的数组下标为i,则它所在行列为(i/M, i%M),
* 则转置前所在行列为(i%M, i/M),可计算此时下标为(i%M)*N+i/M,此为i的前驱。
*
* 2.从一个下标开始直到回到自身没有出现比它小的下标,则环没走过
#include <iostream>using namespace std;#define M 4#define N 2int getPrev(int i, int m, int n) {return (i % M) * N + i / M;}int getNext(int i, int m, int n) {return (i % N) * M + i / N;}void moveData(int* arr, int i) {int cur = i;int temp = arr[i];int prev = getPrev(i, M, N);while (prev != i) {arr[cur] = arr[prev];cur = prev;prev = getPrev(cur, M, N);}arr[cur] = temp;}void transfer(int* arr, int m, int n) {for (int i = 0; i < m * n; ++i) {int next = getNext(i, m, n);while (i < next) {next = getNext(next, m, n);}//环未走过if (i == next) {moveData(arr, i);}}}void printMatrix(int* matrix, int m, int n) {for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {cout << matrix[i * n + j] << " ";}cout << endl;}}
1 0
- O(1)空间内实现矩阵转置
- O(1)空间内实现矩阵转置
- 矩阵转置 O(1)空间
- 矩阵转置 O(1)空间
- 矩阵转置,空间复杂度要求为O(1)
- 矩阵原地转置,空间复杂度为O(1)(暂时先保存下来)
- 在O(1)的空间复杂度内,打印螺旋数组
- LeetCode 135. Candy (O(n)时间 O(n)和O(1)空间的两种实现)
- 【编程练习】蛇形矩阵,空间复杂度为O(n*n)实现(小米面试题 GNU C实现)
- 矩阵空间、秩1矩阵
- 人人都来写算法 之 矩阵顺时针旋转90度,空间效率O(1),时间效率O(n*n)
- 【重构】人人都来写算法 之 矩阵顺时针旋转90度,空间效率O(1),时间效率O(n*n)
- 归并排序,空间复杂度O(1)的实现
- 归并排序空间复杂度O(1)的实现
- 实现链表逆序,空间复杂度为O(1)
- 给一个正整数N,打印NxN的蛇形矩阵(二) 之空间复杂度O(1)
- 给一个正整数N,打印NxN的蛇形矩阵(二) 之空间复杂度O(1)
- C堆内矩阵实现
- MyBatis在Spring中简单配置
- 编译原理作业,一介逻辑公式实例化
- 趣拍云:2016年短视频大数据研究报告
- java最简单的效率检测
- 如何让孩子爱上设计模式 —— 1.面向对象相关概述
- O(1)空间内实现矩阵转置
- Java使用JDBC操作数据库
- 创建和存储cookie
- zipalign命令无法使用的问题
- mybatis 3.3.0的一个bug 时间与字符串
- 使用aspectj模拟返回消息
- mysql 调用存储过程
- Error:Execution failed for task ':app:mergeDebugResources'. > Error: Java.util.concurrent.ExecutionE
- Java SE学习笔记:数据结构、ArrayList/Hash/Queue/Linked(一)