顺序表9:1464. 数组中两元素的最大乘积

题目链接
https://leetcode.cn/problems/maximum-product-of-two-elements-in-an-array/description/
给你一个整数数组 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

点击查看代码
class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int max=0,ret=0;
        for(int i=0;i<nums.size();++i){
            for(int j=0;j<nums.size();++j){
                if(i!=j){
                    ret=(nums[i]-1)*(nums[j]-1);
                    if(ret>max)max=ret;
                }
            }
        }
        return max;
    }
};

在这段代码中,int subMaxIdx = -1; 不直接赋值为 0 主要有以下原因:
区分未初始化状态:将 subMaxIdx 初始化为 -1,可以很清晰地表示其尚未被赋予一个有效的索引值,即还没有找到第二大的数。如果初始化为 0,就无法明确它是真的表示索引为 0 的元素是第二大的候选数,还是仅仅是一个初始值。使用 -1 作为特殊标记,能够避免这种混淆,使代码的逻辑更加清晰,更易于理解和维护。
避免错误判断:假设将 subMaxIdx 初始化为 0,当数组中的第一个元素恰好是最大值时,在寻找第二大元素的过程中,代码可能会错误地认为索引 0 对应的元素已经是第二大元素的候选了,而忽略了后续可能存在比它更大但不是最大值的元素。而初始化为 -1,可以确保在第一次比较时,无论索引 0 处的元素值是多少,都会将第一个非最大值的元素索引赋给 subMaxIdx,从而正确地找到第二大元素。

posted @ 2025-03-06 21:03  一点都不无聊  阅读(289)  评论(0)    收藏  举报