矩阵逆时针旋转180度
思路:
解决此问题需要四个步骤:
1- 找到矩阵的转置。
2- 转置的反转列。
3- 找到矩阵的转置。
4- 转置的反转列
C++代码实现
// C++ implementation to sort the given matrix
#include <iostream>
#include <algorithm>
using namespace std;
#define SIZE 10
#define R 4
#define c 4
//矩阵的转置
void transpose(int arr[R][c]) {
for (int i = 0; i < R; i++)
{
for (int j = i; j < c; j++)
{
//行列交换
swap(arr[i][j], arr[j][i]);
}
}
}
void reverseCloums(int arr[R][c]) {
for (int i = 0; i <c; i++)
{
for (int j = 0,k=c-1; j< k; k--,j++)
{
swap(arr[j][i],arr[k][i]);
}
}
}
//旋转180
void rotate180(int arr[R][c])
{
transpose(arr);
reverseCloums(arr);
transpose(arr);
reverseCloums(arr);
}
void printMatrix(int arr[R][c])
{
for (int i = 0; i < R; i++) {
for (int j = 0; j <c; j++)
cout << arr[i][j] << " ";
cout << '\n';
}
}
// Driver program to test above
int main()
{
int arr[R][c] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
rotate180(arr);
printMatrix(arr);
return 0;
}
输出结果
16 15 14 13
12 11 10 9
8 7 6 5
4 3 2 1
查找矩阵唯一元素
给定一个矩阵 mat[][] 有 n 行和 m 列。我们需要找到矩阵中唯一的元素,即那些在矩阵中不重复的元素或那些频率为 1 的元素。
解决办法
这个想法是使用散列并遍历矩阵的所有元素,如果字典中存在一个元素,则增加其计数。否则插入一个值为 1 的元素。
代码实现
#include <iostream>
using namespace std;
#define R 4
#define C 4
void unique(int arr[R][C],int M,int n) {
int maxinum = 0, flag = 0;
for (int i = 0; i < M; i++)
{
for (int j = 0; j < n; j++)
{
//找出最大值
if (maxinum<arr[i][j])
{
maxinum = arr[i][j];
}
}
}
int* b = new int[maxinum + 1];
//初始化 数组
for (int i = 0; i <=maxinum ; i++)
{
b[i] = 0;
}
for (int i = 0; i < M; i++)
{
for (int j = 0; j < n; j++)
{
int y = arr[i][j];
//数值当下标,下标值为2证明此元素不唯一
b[y]++;
}
}
for (int i = 1; i <=maxinum; i++)
{
if (b[i]==1)
{
cout << i << " ";
flag = 1;
}
}
if (!flag)
{
cout << "未找到唯一元素" << endl;
}
//释放内存
}
int main() {
int mat[R][C] = { { 1, 2, 3, 20 },
{ 5, 6, 20, 25 },
{ 1, 3, 5, 6 },
{ 6, 7, 8, 15 } };
unique(mat,R,C);
return 0;
}
输出结果
2 7 8 15 25
时间复杂度: O(m*n),其中 m 是行数,n 是列数。
辅助空间: O(max(matrix))。