class Solution {
public:
int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
}
};
1458. 两个子序列的最大点积
给你两个数组 nums1
和 nums2
。
请你返回 nums1
和 nums2
中两个长度相同的 非空 子序列的最大点积。
数组的非空子序列是通过删除原数组中某些元素(可能一个也不删除)后剩余数字组成的序列,但不能改变数字间相对顺序。比方说,[2,3,5]
是 [1,2,3,4,5]
的一个子序列而 [1,5,3]
不是。
示例 1:
输入:nums1 = [2,1,-2,5], nums2 = [3,0,-6] 输出:18 解释:从 nums1 中得到子序列 [2,-2] ,从 nums2 中得到子序列 [3,-6] 。 它们的点积为 (2*3 + (-2)*(-6)) = 18 。
示例 2:
输入:nums1 = [3,-2], nums2 = [2,-6,7] 输出:21 解释:从 nums1 中得到子序列 [3] ,从 nums2 中得到子序列 [7] 。 它们的点积为 (3*7) = 21 。
示例 3:
输入:nums1 = [-1,-1], nums2 = [1,1] 输出:-1 解释:从 nums1 中得到子序列 [-1] ,从 nums2 中得到子序列 [1] 。 它们的点积为 -1 。
提示:
1 <= nums1.length, nums2.length <= 500
-1000 <= nums1[i], nums2[i] <= 100
点积:
定义a = [a1, a2,…, an]
和b
= [b1, b2,…, bn]
的点积为: 这里的 Σ 指示总和符号。
原站题解
golang 解法, 执行用时: 4 ms, 内存消耗: 6.1 MB, 提交时间: 2023-10-25 23:01:18
func maxDotProduct(nums1 []int, nums2 []int) int { var fill, max, dp, length = func(src []int, dst int) []int { for index := range src { src[index] = dst } return src }, func(nums ...int) (num int) { if len(nums) > 0 { num = nums[0] for _, n := range nums { if n > num { num = n } } } return }, make([][]int, len(nums1)+1), len(nums2) + 1 dp[0] = fill(make([]int, length), -1e8) for index, i := 1, 1; index <= len(nums1); index++ { for i, dp[index] = 1, fill(make([]int, length), -1e8); i <= len(nums2); i++ { dp[index][i] = nums1[index-1] * nums2[i-1] dp[index][i] = max(dp[index][i], dp[index][i]+dp[index-1][i-1], dp[index][i-1], dp[index-1][i], dp[index-1][i-1]) } } return dp[len(nums1)][len(nums2)] }
java 解法, 执行用时: 10 ms, 内存消耗: 42 MB, 提交时间: 2023-10-25 23:00:48
class Solution { public int maxDotProduct(int[] nums1, int[] nums2) { int m = nums1.length; int n = nums2.length; int[][] f = new int[m][n]; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { int xij = nums1[i] * nums2[j]; f[i][j] = xij; if (i > 0) { f[i][j] = Math.max(f[i][j], f[i - 1][j]); } if (j > 0) { f[i][j] = Math.max(f[i][j], f[i][j - 1]); } if (i > 0 && j > 0) { f[i][j] = Math.max(f[i][j], f[i - 1][j - 1] + xij); } } } return f[m - 1][n - 1]; } }
python3 解法, 执行用时: 420 ms, 内存消耗: 18.8 MB, 提交时间: 2023-10-25 23:00:34
class Solution: def maxDotProduct(self, nums1: List[int], nums2: List[int]) -> int: m, n = len(nums1), len(nums2) f = [[0] * n for _ in range(m)] for i in range(m): for j in range(n): xij = nums1[i] * nums2[j] f[i][j] = xij if i > 0: f[i][j] = max(f[i][j], f[i - 1][j]) if j > 0: f[i][j] = max(f[i][j], f[i][j - 1]) if i > 0 and j > 0: f[i][j] = max(f[i][j], f[i - 1][j - 1] + xij) return f[m - 1][n - 1]
cpp 解法, 执行用时: 40 ms, 内存消耗: 13.7 MB, 提交时间: 2023-10-25 22:59:43
class Solution { public: int maxDotProduct(vector<int>& nums1, vector<int>& nums2) { int m = nums1.size(); int n = nums2.size(); vector<vector<int>> f(m, vector<int>(n)); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { int xij = nums1[i] * nums2[j]; f[i][j] = xij; if (i > 0) { f[i][j] = max(f[i][j], f[i - 1][j]); } if (j > 0) { f[i][j] = max(f[i][j], f[i][j - 1]); } if (i > 0 && j > 0) { f[i][j] = max(f[i][j], f[i - 1][j - 1] + xij); } } } return f[m - 1][n - 1]; } };
cpp 解法, 执行用时: 12 ms, 内存消耗: 10.6 MB, 提交时间: 2023-10-25 22:59:20
class Solution { public: int maxDotProduct(vector<int>& nums1, vector<int>& nums2) { int dp[501][501]; for(int i = 0; i <= nums1.size(); i++) { for(int j = 0; j <= nums2.size(); j++) { dp[i][j] = -1000*1000*500; } } for(int i = 1; i <= nums1.size(); i++) { for(int j = 1; j <= nums2.size(); j++) { int a = nums1[i-1]; int b = nums2[j-1]; dp[i][j] = max(dp[i][j], a*b); dp[i][j] = max(dp[i][j], dp[i-1][j-1] + a*b); dp[i][j] = max(dp[i][j], dp[i-1][j-1]); dp[i][j] = max(dp[i][j], dp[i-1][j]); dp[i][j] = max(dp[i][j], dp[i][j-1]); } } return dp[nums1.size()][nums2.size()]; } };
cpp 解法, 执行用时: 60 ms, 内存消耗: 13.6 MB, 提交时间: 2023-10-25 22:58:59
class Solution { public: int maxDotProduct(vector<int>& nums1, vector<int>& nums2) { int sz1=nums1.size(),sz2=nums2.size(); vector<vector<int>> dp(sz1+1,vector<int>(sz2+1,-1e8)); for(int i=1;i<=sz1;i++){ for(int j=1;j<=sz2;j++){ //1.1 dp[i][j]=nums1[i-1]*nums2[j-1]; //1.2 dp[i][j]=max(dp[i][j],nums1[i-1]*nums2[j-1]+dp[i-1][j-1]); //2 dp[i][j]=max(dp[i][j],dp[i][j-1]); //3 dp[i][j]=max(dp[i][j],dp[i-1][j]); //4 dp[i][j]=max(dp[i][j],dp[i-1][j-1]); } } return dp[sz1][sz2]; } };