Last Updated on 2023-12-18 by Clay
題目
The product difference between two pairs (a, b)
and (c, d)
is defined as (a * b) - (c * d)
.
- For example, the product difference between
(5, 6)
and(2, 7)
is(5 * 6) - (2 * 7) = 16
.
Given an integer array nums
, choose four distinct indices w
, x
, y
, and z
such that the product difference between pairs (nums[w], nums[x])
and (nums[y], nums[z])
is maximized.
Return the maximum such product difference.
Example 1:
Input: nums = [5,6,2,7,4]
Output: 34
Explanation: We can choose indices 1 and 3 for the first pair (6, 7) and indices 2 and 4 for the second pair (2, 4). The product difference is (6 * 7) – (2 * 4) = 34.
Example 2:
Input: nums = [4,2,5,9,7,4,8]
Output: 64
Explanation: We can choose indices 3 and 6 for the first pair (9, 8) and indices 1 and 5 for the second pair (2, 4). The product difference is (9 * 8) – (2 * 4) = 64.
Constraints:
4 <= nums.length <= 104
1 <= nums[i] <= 104
解題思路
最簡單的方法就是使用排序、然後取頭尾。然而,這個方法的時間複雜度是 O(n*log(n)),實在是不夠好。
另外一個很直覺的解法就是設定四個變數,分別代表最大、次大、最小、次小的四個數值。並且在遍歷整個輸入陣列時同步更新。
需要注意的是,如果最大的數值被取代,則原先最大的數值會再賦值給次大的變數;最小和次小的狀況同理。
如此一來,這樣的時間複雜度是 O(n)(只需要遍歷一次)並且空間複雜度是 O(1)。
C++ 範例程式碼
class Solution {
public:
int maxProductDifference(vector<int>& nums) {
// Init
int max1 = INT_MIN;
int max2 = INT_MIN;
int min1 = INT_MAX;
int min2 = INT_MAX;
// Traversal
for (int& num: nums) {
if (num >= max1) {
max2 = max1;
max1 = num;
}
else if (num >= max2) {
max2 = num;
}
if (num <= min1) {
min2 = min1;
min1 = num;
}
else if (num <= min2) {
min2 = num;
}
}
return max1 * max2 - min1 * min2;
}
};
Python 範例程式碼
class Solution:
def maxProductDifference(self, nums: List[int]) -> int:
# Init
max1 = -1
max2 = -1
min1 = 10000
min2 = 10000
# Traversal
for num in nums:
if num >= max1:
max2 = max1
max1 = num
elif num >= max2:
max2 = num
if num <= min1:
min2 = min1
min1 = num
elif num <= min2:
min2 = num
return max1 * max2 - min1 * min2