矩阵作为线性代数核心内容之一也是刷题人时常会遇到的一种类型。本篇博客简单介绍一下矩阵转置、上三角矩阵以及杨氏矩阵。
1.转置矩阵:输入m行n列的矩阵以n行m列的方式打印出来。只要将数组的行列进行交换即可,并不难想也不难写.(相应练习:牛客网BC107)
1. #include<stdio.h> 2. int main() 3. { 4. int n = 0; 5. int m = 0; 6. scanf("%d%d", &n, &m); 7. int arr[10][10] = { 0 }; 8. int i = 0; 9. int j = 0; 10. for (i = 0; i < n; i++) 11. { 12. 13. for (j = 0; j < m; j++) 14. { 15. scanf("%d", &arr[i][j]); 16. } 17. } 18. 19. for (i = 0; i < m; i++) 20. { 21. 22. for (j = 0; j < n; j++) 23. { 24. printf("%d ", arr[j][i]); 25. } 26. printf("\n"); 27. } 28. return 0; 29. }
2.上三角矩阵:对角线以下所有元素都为零,但凡有一个元素非零就不是上三角(相应练习:BC106)
1. #include<stdio.h> 2. int main() 3. { 4. int n = 0; 5. scanf("%d", &n); 6. int arr[10][10] = { 0 }; 7. int flag = 1;//表示是上三角 8. //读取元素 9. for (int i = 0; i < n; i++) 10. { 11. 12. for (int j = 0; j < n; j++) 13. { 14. scanf("%d", &arr[i][j]); 15. 16. } 17. } 18. //数据读取完毕后开始判断 19. for (int i = 0; i < n; i++) 20. { 21. //对角线的位置i与j下标一样,这也就说明当j小于i时元素位于对角线下方 22. for (int j = 0; j < i; j++) 23. { 24. if (arr[i][j] != 0)//但凡对角线以下存在不为零的元素就表示不是上三角 25. { 26. flag = 0; 27. goto end; 28. } 29. } 30. } 31. end: 32. if (flag == 1) 33. printf("YES\n"); 34. else 35. printf("NO\n"); 36. return 0; 37. }
3.杨氏矩阵:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度为:O(n)
因为时间复杂度的要求,遍历数组的办法是不可行的。因此要采用特殊位置比较的方法。
代码如下:
1. #include<stdio.h> 2. int mat_find(int arr[3][3], int* px, int* py, int k) 3. { 4. int x = 0; 5. int y = *py-1; 6. while (x <= (*px) - 1 && y >= 0) 7. { 8. if (arr[x][y] < k) 9. { 10. x++; 11. } 12. else if(arr[x][y]>k) 13. { 14. y--; 15. } 16. else 17. { 18. *px = x; 19. *py = y; 20. return 1; 21. } 22. } 23. return 0; 24. 25. } 26. 27. int main() 28. { 29. int arr[3][3] = { 1,2,3,4,5,6,7,8,9 }; 30. int k = 0;//查找元素 31. int a = 3; 32. int b = 3; 33. scanf("%d", &k); 34. int ret = mat_find(arr, &a, &b, k); 35. if (ret == 1) 36. printf("%d %d \n",a,b); 37. else 38. printf("找不到\n"); 39. 40. return 0; 41. }
此代码通过改变a,b的位置来实现输出要寻找元素的下标,这样有一个缺陷就是:在二次调用mat_find之前要先将a和b的值重置,否则会导致查找失败。
结束语:
线代的学习因为疫情的原因是躲在屏幕后面上网课,导致我忘的比学的还快,因此很烦矩阵,不知道各位如何看待。那么今天的博客就写(水)到这里了,你学废了吗?