给定两个 n*n 的矩阵 A 和 B ,求 A*B 。
数据范围:
,
要求:空间复杂度
, 时间复杂度
进阶:本题也有空间复杂度
,时间复杂度
的解法
PS:更优时间复杂度的算法这里并不考察
import numpy as np # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # @param a int整型二维数组 第一个矩阵 # @param b int整型二维数组 第二个矩阵 # @return int整型二维数组 # class Solution: def solve(self, a, b): # write code here a = np.array(a) b = np.array(b) r = np.dot(a, b) return r.tolist()官方参考答案
class Solution
{
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param a int整型vector<vector<>> 第一个矩阵
* @param b int整型vector<vector<>> 第二个矩阵
* @return int整型vector<vector<>>
*/
vector<vector<int>> solve(vector<vector<int>> & a, vector<vector<int>> & b)
{
if (a.size() == 0)
return {};
vector<vector<int>> ret(a.size(), vector<int>(a.size(), 0));
for (int i = 0; i < a.size(); ++i)
{
for (int j = 0; j < a.size(); ++j)
{
for (int k = 0; k < a.size(); ++k)
ret[i][j] += (a[i][k] * b[k][j]);
}
}
return ret;
}
}; public int[][] solve (int[][] a, int[][] b) {
// write code here
int m=a.length;
int[][] res=new int[m][m];
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
for(int k=0;k<m;k++){
res[i][k]+=a[i][j]*b[j][k];
}
}
}
return res;
} def transpose(num):
m = len(num)
n = len(num[0])
dp = [[0 for _ in range(m)] for _ in range(n)]
for i in range(m):
for j in range(n):
dp[j][i] = num[i][j]
return dp
def suan(m,n):
value = 0
for i in range(len(m)):
value += m[i]*n[i]
return value
s = list(map(int,input().split(',')))
x,y,z = s[0],s[1],s[2]
num1 = []
num2 = []
num = [[0 for _ in range(z)] for _ in range(x)]
for _ in range(x):
num1.append(list(map(int, input().split(','))))
for _ in range(y):
num2.append(list(map(int, input().split(','))))
num2 = transpose(num2)
for i in range(x):
for j in range(z):
num[i][j] = suan(num1[i], num2[j])
print(num) import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param a int整型二维数组 第一个矩阵
* @param b int整型二维数组 第二个矩阵
* @return int整型二维数组
*/
public int[][] solve (int[][] a, int[][] b) {
// write code here
int[][] res = new int[a.length][b[0].length];
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b[0].length; j++) {
for (int k = 0; k < a[0].length; k++) {
res[i][j] += a[i][k] * b[k][j];
}
}
}
return res;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param a int整型二维数组 第一个矩阵
* @param b int整型二维数组 第二个矩阵
* @return int整型二维数组
*/
public int[][] solve(int[][] a, int[][] b) {
// write code here
// 矩阵乘法等于矩阵行乘矩阵列
// mXn矩阵乘nXp矩阵=mXp矩阵
int[][] res = new int[a.length][b[0].length];
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
for (int k = 0; k < b[j].length; k++) {
res[i][k] += a[i][j] * b[j][k];
}
}
}
return res;
}
} class Solution: def solve(self , a: List[List[int]], b: List[List[int]]) -> List[List[int]]: # write code here res = [[0]*len(b[0]) for i in range(len(a))] for i in range(len(a)): for j in range(len(b[0])): for k in range(len(b)): res[i][j] += a[i][k]*b[k][j] return res
import java.util.*;
//六刷
public class Solution {
public int[][] solve (int[][] a, int[][] b) {
int len=a.length;
if (len == 0) return null;
int[][] res = new int[len][len];
// boolean flag=true;
// for (int row = 0; row < len; row++) {
// for (int col = 0; col < len; col++) {
// if(a[row][col]!=0){
// flag=false;
// break;
// }
// }
// }
// if(flag==true)return a;
for (int row = 0; row < len; row++) {
for (int col = 0; col < len; col++) {
res[row][col] = matrixMul(a, b, row, col);
}
}
return res;
}
// 第一个矩阵 i 行和第二个矩阵 j 列的乘积
public int matrixMul (int[][] a, int[][] b, int row, int col) {
int result = 0;
int le=a.length;
for (int k = 0; k < le; k++) {
result += a[row][k] * b[k][col];
}
return result;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param a int整型二维数组 第一个矩阵
* @param b int整型二维数组 第二个矩阵
* @return int整型二维数组
*/
public int[][] solve (int[][] a, int[][] b) {
// write code here
// [1,2 [1,2
// 3,4] * 3,4]
int n = a.length;
int[][] ans = new int[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
ans[i][j] += a[i][k] * b[k][j];
}
}
}
return ans;
}
} class Solution: def solve(self , a , b ): # write code here n = len(a) dat = [[0]*n for _ in range(n)] func = lambda x,y : x*y for i,val in enumerate(a): time = 0 k = 0 while time<len(b): value = [] for j in range(len(b)): value.append(b[j][k]) dat[i][time] = sum(list(map(func, val, value))) time += 1 k += 1 return dat
class Solution {
public:
vector<vector<int> > solve(vector<vector<int> >& a, vector<vector<int> >& b) {
// write code here
//矩阵能够相乘的前提是前面矩阵的列数和后面矩阵的行数相同,如果不同的话不能相乘
vector<vector<int>>res;
vector<int>ans;
if(a[0].size()!=b.size())return res;//无法相乘
int temp=0;
for(int m=0;m<a.size();m++)//每一行循环完之后将ans容器放进res容器中
{
for(int n=0;n<b[0].size();n++)
{
for(int i=0;i<a[0].size();i++)
{
temp+=a[m][i]*b[i][n];//这里是乘法
//因为是同时进行的,对应位置同时相乘,不能嵌套循环
}
ans.push_back(temp);
temp=0;//矩阵当前元素存入之后要清零,以防后面继续累加
}
res.push_back(ans);
ans.clear();//和temp清零一样,以防积累效应
}
return res;
}
}; class Solution: def solve(self , a , b ): # write code here m, k, n = len(a), len(a[0]), len(b[0]) res = [[0 for _ in range(n)] for _ in range(m)] # res[i][j] = sum() for i in range(m): for j in range(n): res[i][j] = sum(x * y for x, y in zip(a[i], [r[j] for r in b])) return res
class Solution:
def solve(self , a , b ):
# write code here
length = len(a)
matrix = [[0 for j in range(length)] for i in range(length)]
for i in range(length):
for j in range(length):
for m in range(length):
matrix[i][j] += a[i][m] * b[m][j]
return matrix import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param a int整型二维数组 第一个矩阵
* @param b int整型二维数组 第二个矩阵
* @return int整型二维数组
*/
public int[][] solve (int[][] a, int[][] b) {
if (a.length == 0 || b.length == 0) return null;
int[][] res = new int[a.length][a[0].length];
for (int row = 0; row < a.length; row++) {
for (int col = 0; col < a[0].length; col++) {
res[row][col] = matrixMul(a, b, row, col);
}
}
return res;
}
// 第一个矩阵 i 行和第二个矩阵 j 列的乘积
public int matrixMul (int[][] a, int[][] b, int row, int col) {
int result = 0;
for (int k = 0; k < a.length; k++) {
result += a[row][k] * b[k][col];
}
return result;
}
}