「数组」线性枚举(遍历)/ LeetCode 1464(C++)

目录

概述

思路

算法过程

复杂度

Code


概述

在一切数据结构一切算法开始的时候,我们先来说的一定是数组的遍历。

LeeCode 2464:

给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j使 (nums[i]-1)*(nums[j]-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 。 

思路

线性枚举,即遍历,是最基本的查找算法。

这几乎是最一般的对数组进行完全分析的手段:我们从数组的开始,一个一个读到数组的末尾。 

C++提供了多种遍历手段,有如:

const int n;            //n为数组长度
while(n--)              //次数while循环
for(int i=0;i<n;i++)    //下标for循环
for(const int& num:nums)//范围for循环(C++11)

每轮循环都是对上一轮循环的继承,因此: 

我们可以在单次循环体内进行一些操作同时维护多个变量来将遍历次数尽可能压缩。

算法过程

对于一个数组,我们可以同时维护他的最大值MAX和次大值max

定义MAX(最大)和max(次大)初始值为0,遍历过程中如果监测到nums[i]>MAX,则将旧的最大值赋给次大值,然后用nums[i]更新最大值;如果nums[i]>max,则只更新次大值。
这样我们就在通过一次遍历同时维护了数组的最大值和次大值。

复杂度

时间复杂度: O(n)
空间复杂度: O(1)

 

Code

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int MAX=0,max=0;
        for(int i=0;i<nums.size();i++){
           if(nums[i]>MAX){max=MAX;MAX=nums[i];}
           else if(nums[i]>max){max=nums[i];}
        }
        return (MAX-1)*(max-1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值