一【题目类别】
- 优先队列
二【题目难度】
- 简单
三【题目编号】
- 1464.数组中两元素的最大乘积
四【题目描述】
- 给你一个整数数组
nums
,请你选择数组的两个不同下标i
和j
,使(nums[i]-1)*(nums[j]-1)
取得最大值。 - 请你计算并返回该式的最大值。
五【题目示例】
-
示例 1:
- 输入:nums = [3,4,5,2]
- 输出:12
- 解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)(nums[2]-1) = (4-1)(5-1) = 3*4 = 12 。
-
示例 2:
- 输入:nums = [1,5,4,5]
- 输出:16
- 解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。
-
示例 3:
- 输入:nums = [3,7]
- 输出:12
六【题目提示】
2 <= nums.length <= 500
1 <= nums[i] <= 10^3
七【解题思路】
- 该题比较简单,很容易就想到使用大顶堆来处理该问题,每次取出当前数组的最大值,然后按照题目要求进行运算并返回即可
- 不过如果用C语言来使用大顶堆解决该问题就比较麻烦了,具体可以参考下面的代码
八【时间频度】
- 时间复杂度: O ( n × l o g n ) O(n \times logn) O(n×logn), n n n为传入的数组的长度
- 空间复杂度: O ( n ) O(n) O(n), n n n为传入的数组的长度
九【代码实现】
- Java语言版
class Solution {
public int maxProduct(int[] nums) {
// 构造大顶堆
PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>((a, b) -> (b - a));
for (Integer num : nums) {
pQueue.offer(num);
}
// 获取两个最大值
int x = pQueue.poll();
int y = pQueue.poll();
// 返回结果
return (x - 1) * (y - 1);
}
}
- Python语言版
class Solution:
def maxProduct(self, nums: List[int]) -> int:
# 构造大顶堆
heap = [-num for num in nums]
heapq.heapify(heap)
# 获取两个最大值
x = -heapq.heappop(heap)
y = -heapq.heappop(heap)
# 返回结果
return (x - 1) * (y - 1)
- C语言版
// 交换数据
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
// 向大顶堆中插入元素
void push(int *heap, int *heapSize, int x)
{
heap[++(*heapSize)] = x;
for (int i = (*heapSize); i > 1 && heap[i] > heap[i >> 1]; i >>= 1)
{
swap(&heap[i], &heap[i >> 1]);
}
}
// 弹出大顶堆的堆顶元素
void pop(int *heap, int *heapSize)
{
heap[1] = heap[(*heapSize)--];
int temp = heap[1];
int i = 1;
int j = 2;
while (j <= (*heapSize))
{
if (j != (*heapSize) && heap[j + 1] > heap[j])
{
j++;
}
if (heap[j] > temp)
{
heap[i] = heap[j];
i = j;
j = i << 1;
}
else
{
break;
}
}
heap[i] = temp;
}
// 返回大顶堆的堆顶元素值
int top(int *heap)
{
return heap[1];
}
int maxProduct(int* nums, int numsSize)
{
// 构造大顶堆
int heap[numsSize + 1];
int heapSize = 0;
for (int i = 0;i < numsSize; i++)
{
push(heap, &heapSize, nums[i]);
}
// 获取两个最大值
int first = top(heap);
pop(heap, &heapSize);
int second = top(heap);
pop(heap, &heapSize);
// 返回结果
return (first - 1) * (second - 1);
}
十【提交结果】
-
Java语言版
-
Python语言版
-
C语言版