【LeetCode每日一题】——1464.数组中两元素的最大乘积

一【题目类别】

  • 优先队列

二【题目难度】

  • 简单

三【题目编号】

  • 1464.数组中两元素的最大乘积

四【题目描述】

  • 给你一个整数数组 nums,请你选择数组的两个不同下标 ij,使 (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为传入的数组的长度

九【代码实现】

  1. 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);
    }
}
  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)
  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);
}

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C语言版
    在这里插入图片描述

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值