Skip to content

Commit 3bda3f4

Browse files
authored
feat: add solutions to lc problem: No.1874 (doocs#3593)
1 parent d693654 commit 3bda3f4

File tree

7 files changed

+102
-59
lines changed

7 files changed

+102
-59
lines changed

Diff for: solution/1800-1899/1874.Minimize Product Sum of Two Arrays/README.md

+37-19
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ tags:
5656

5757
<!-- solution:start -->
5858

59-
### 方法一
59+
### 方法一:贪心 + 排序
60+
61+
由于两个数组都是正整数,要使得乘积和最小,我们可以将两个数组中的最大值和最小值相乘,次大值和次小值相乘,以此类推。
62+
63+
因此,我们将数组 $\textit{nums1}$ 按照升序排序,将数组 $\textit{nums2}$ 按照降序排序,然后将两个数组对应位置的元素相乘,累加即可。
64+
65+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 是数组 $\textit{nums1}$ 的长度。
6066

6167
<!-- tabs:start -->
6268

@@ -66,11 +72,8 @@ tags:
6672
class Solution:
6773
def minProductSum(self, nums1: List[int], nums2: List[int]) -> int:
6874
nums1.sort()
69-
nums2.sort()
70-
n, res = len(nums1), 0
71-
for i in range(n):
72-
res += nums1[i] * nums2[n - i - 1]
73-
return res
75+
nums2.sort(reverse=True)
76+
return sum(x * y for x, y in zip(nums1, nums2))
7477
```
7578

7679
#### Java
@@ -80,11 +83,12 @@ class Solution {
8083
public int minProductSum(int[] nums1, int[] nums2) {
8184
Arrays.sort(nums1);
8285
Arrays.sort(nums2);
83-
int n = nums1.length, res = 0;
86+
int n = nums1.length;
87+
int ans = 0;
8488
for (int i = 0; i < n; ++i) {
85-
res += nums1[i] * nums2[n - i - 1];
89+
ans += nums1[i] * nums2[n - i - 1];
8690
}
87-
return res;
91+
return ans;
8892
}
8993
}
9094
```
@@ -95,28 +99,42 @@ class Solution {
9599
class Solution {
96100
public:
97101
int minProductSum(vector<int>& nums1, vector<int>& nums2) {
98-
sort(nums1.begin(), nums1.end());
99-
sort(nums2.begin(), nums2.end());
100-
int n = nums1.size(), res = 0;
102+
ranges::sort(nums1);
103+
ranges::sort(nums2, greater<int>());
104+
int n = nums1.size();
105+
int ans = 0;
101106
for (int i = 0; i < n; ++i) {
102-
res += nums1[i] * nums2[n - i - 1];
107+
ans += nums1[i] * nums2[i];
103108
}
104-
return res;
109+
return ans;
105110
}
106111
};
107112
```
108113
109114
#### Go
110115
111116
```go
112-
func minProductSum(nums1 []int, nums2 []int) int {
117+
func minProductSum(nums1 []int, nums2 []int) (ans int) {
113118
sort.Ints(nums1)
114119
sort.Ints(nums2)
115-
res, n := 0, len(nums1)
116-
for i, num := range nums1 {
117-
res += num * nums2[n-i-1]
120+
for i, x := range nums1 {
121+
ans += x * nums2[len(nums2)-1-i]
118122
}
119-
return res
123+
return
124+
}
125+
```
126+
127+
#### TypeScript
128+
129+
```ts
130+
function minProductSum(nums1: number[], nums2: number[]): number {
131+
nums1.sort((a, b) => a - b);
132+
nums2.sort((a, b) => b - a);
133+
let ans = 0;
134+
for (let i = 0; i < nums1.length; ++i) {
135+
ans += nums1[i] * nums2[i];
136+
}
137+
return ans;
120138
}
121139
```
122140

Diff for: solution/1800-1899/1874.Minimize Product Sum of Two Arrays/README_EN.md

+37-19
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,13 @@ tags:
7474

7575
<!-- solution:start -->
7676

77-
### Solution 1
77+
### Solution 1: Greedy + Sorting
78+
79+
Since both arrays consist of positive integers, to minimize the sum of products, we can multiply the largest value in one array with the smallest value in the other array, the second largest with the second smallest, and so on.
80+
81+
Therefore, we sort the array $\textit{nums1}$ in ascending order and the array $\textit{nums2}$ in descending order. Then, we multiply the corresponding elements of the two arrays and sum the results.
82+
83+
The time complexity is $O(n \times \log n)$, and the space complexity is $O(\log n)$. Here, $n$ is the length of the array $\textit{nums1}$.
7884

7985
<!-- tabs:start -->
8086

@@ -84,11 +90,8 @@ tags:
8490
class Solution:
8591
def minProductSum(self, nums1: List[int], nums2: List[int]) -> int:
8692
nums1.sort()
87-
nums2.sort()
88-
n, res = len(nums1), 0
89-
for i in range(n):
90-
res += nums1[i] * nums2[n - i - 1]
91-
return res
93+
nums2.sort(reverse=True)
94+
return sum(x * y for x, y in zip(nums1, nums2))
9295
```
9396

9497
#### Java
@@ -98,11 +101,12 @@ class Solution {
98101
public int minProductSum(int[] nums1, int[] nums2) {
99102
Arrays.sort(nums1);
100103
Arrays.sort(nums2);
101-
int n = nums1.length, res = 0;
104+
int n = nums1.length;
105+
int ans = 0;
102106
for (int i = 0; i < n; ++i) {
103-
res += nums1[i] * nums2[n - i - 1];
107+
ans += nums1[i] * nums2[n - i - 1];
104108
}
105-
return res;
109+
return ans;
106110
}
107111
}
108112
```
@@ -113,28 +117,42 @@ class Solution {
113117
class Solution {
114118
public:
115119
int minProductSum(vector<int>& nums1, vector<int>& nums2) {
116-
sort(nums1.begin(), nums1.end());
117-
sort(nums2.begin(), nums2.end());
118-
int n = nums1.size(), res = 0;
120+
ranges::sort(nums1);
121+
ranges::sort(nums2, greater<int>());
122+
int n = nums1.size();
123+
int ans = 0;
119124
for (int i = 0; i < n; ++i) {
120-
res += nums1[i] * nums2[n - i - 1];
125+
ans += nums1[i] * nums2[i];
121126
}
122-
return res;
127+
return ans;
123128
}
124129
};
125130
```
126131
127132
#### Go
128133
129134
```go
130-
func minProductSum(nums1 []int, nums2 []int) int {
135+
func minProductSum(nums1 []int, nums2 []int) (ans int) {
131136
sort.Ints(nums1)
132137
sort.Ints(nums2)
133-
res, n := 0, len(nums1)
134-
for i, num := range nums1 {
135-
res += num * nums2[n-i-1]
138+
for i, x := range nums1 {
139+
ans += x * nums2[len(nums2)-1-i]
136140
}
137-
return res
141+
return
142+
}
143+
```
144+
145+
#### TypeScript
146+
147+
```ts
148+
function minProductSum(nums1: number[], nums2: number[]): number {
149+
nums1.sort((a, b) => a - b);
150+
nums2.sort((a, b) => b - a);
151+
let ans = 0;
152+
for (let i = 0; i < nums1.length; ++i) {
153+
ans += nums1[i] * nums2[i];
154+
}
155+
return ans;
138156
}
139157
```
140158

Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
class Solution {
22
public:
33
int minProductSum(vector<int>& nums1, vector<int>& nums2) {
4-
sort(nums1.begin(), nums1.end());
5-
sort(nums2.begin(), nums2.end());
6-
int n = nums1.size(), res = 0;
4+
ranges::sort(nums1);
5+
ranges::sort(nums2, greater<int>());
6+
int n = nums1.size();
7+
int ans = 0;
78
for (int i = 0; i < n; ++i) {
8-
res += nums1[i] * nums2[n - i - 1];
9+
ans += nums1[i] * nums2[i];
910
}
10-
return res;
11+
return ans;
1112
}
12-
};
13+
};
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
func minProductSum(nums1 []int, nums2 []int) int {
1+
func minProductSum(nums1 []int, nums2 []int) (ans int) {
22
sort.Ints(nums1)
33
sort.Ints(nums2)
4-
res, n := 0, len(nums1)
5-
for i, num := range nums1 {
6-
res += num * nums2[n-i-1]
4+
for i, x := range nums1 {
5+
ans += x * nums2[len(nums2)-1-i]
76
}
8-
return res
9-
}
7+
return
8+
}

Diff for: solution/1800-1899/1874.Minimize Product Sum of Two Arrays/Solution.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ class Solution {
22
public int minProductSum(int[] nums1, int[] nums2) {
33
Arrays.sort(nums1);
44
Arrays.sort(nums2);
5-
int n = nums1.length, res = 0;
5+
int n = nums1.length;
6+
int ans = 0;
67
for (int i = 0; i < n; ++i) {
7-
res += nums1[i] * nums2[n - i - 1];
8+
ans += nums1[i] * nums2[n - i - 1];
89
}
9-
return res;
10+
return ans;
1011
}
11-
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
class Solution:
22
def minProductSum(self, nums1: List[int], nums2: List[int]) -> int:
33
nums1.sort()
4-
nums2.sort()
5-
n, res = len(nums1), 0
6-
for i in range(n):
7-
res += nums1[i] * nums2[n - i - 1]
8-
return res
4+
nums2.sort(reverse=True)
5+
return sum(x * y for x, y in zip(nums1, nums2))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
function minProductSum(nums1: number[], nums2: number[]): number {
2+
nums1.sort((a, b) => a - b);
3+
nums2.sort((a, b) => b - a);
4+
let ans = 0;
5+
for (let i = 0; i < nums1.length; ++i) {
6+
ans += nums1[i] * nums2[i];
7+
}
8+
return ans;
9+
}

0 commit comments

Comments
 (0)