给定两个 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; } }