7.2刷题两个

三个数的最大乘积

628. 三个数的最大乘积

排序

排序后分情况处理

  1. 当全为负数或正数时,我们只要选择最大的后三位数相乘即可.
  2. 只有一个负数时-直接用后三位相乘即可.
  3. 当负数个数有但还是有三个正数时.分为两种情况两者中取最大值.
    1. 用两个负数的最小值于一个整数的最大值相乘
    2. 用三个整数相乘
  4. 当负数个数多到无法拥有三个整正数时
    1. 用两个负数的最小值于一个整数的最大值相乘

在上面情况中可以看出3情况是判断最多的.但是情况3是的取最大值是可以兼容到124的所以其实我们只需要判断出

  • 负数中的最小值和次小值(也是整体最小值)和最大值相乘
  • 最大值,次大值,次次大值相乘

上面两种情况那个情况的值最大即可.

class Solution {
public:
    int maximumProduct(vector<int>& nums) 
    {
        sort(nums.begin(),nums.end());
        int s = nums.size()-1;
        return max(nums[0]*nums[1]*nums[s],nums[s]*nums[s-1]*nums[s-2]);//一共只有两种情况是我们想要的答案直接返回最大即可.
    }
};

image-20220702132157105

线性扫描

思路和上题类似但是我们不通过排序来得到值了,我们通过线性扫描来得到.

class Solution {
public:
    int maximumProduct(vector<int>& nums) 
    {
        int min1 = INT_MAX,min2 = INT_MAX;//min1为最小值min2为最大值
        int max1 = INT_MIN,max2 = INT_MIN,max3 = INT_MIN;//max1是最大值.....
        for(int i =0;i<nums.size();i++)
        {
            if(nums[i]<min1)
            {
                min2 = min1;//让min2是次小值
                min1 = nums[i];//min1是最小值
            }
            else if(nums[i]<min2)
            {
                min2 = nums[i];
            }
            if(nums[i]>max1)
            {
                max3 = max2;
                max2 = max1;
                max1 = nums[i];
            }
            else if(nums[i]>max2)
            {
                max3 = max2;
                max2 = nums[i];
            }
            else if(nums[i]>max3)
            {
                max3 = nums[i];
            }
        }
        return max(min1*min2*max1,max1*max2*max3);//和上面的思路类似只是这些值不来自排序了
    }
};

image-20220702132343401

有多少小于当前数字的数字

1365. 有多少小于当前数字的数字

image-20220702153700014

image-20220702154010285

哈希思想

标注一下:本人并没有学过哈希,这个标题的哈希思想其实也就是本人在经过几次刷题都说这种是哈希思想所以有此标题

思路:

把数组(数组1及给定的数组)的数字放在另一个数组(我成为数组2)中,将他的值转化为数组2的下标位置,并用数组2记录他的出现次数.

然后我们只需要把对应数组1的值转换到数组2中,把数组二对应下标的前面的下标的内容加上即可.

比如数组1中有元素8,我们就只需要将数组2中的前八个下标值相加(0,1,2,3,4,5,6,7).

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) 
    {
        vector<int> ret(nums.size());
        int arr[101] = {0};//利用哈希思想
        for(int i = 0;i<nums.size();i++)
        {
            arr[nums[i]]++;
        }
        for(int i =0;i<nums.size();i++)
        {
            int tmp =0;
            for(int j =0;j<nums[i];j++)
            {
                tmp += arr[j];
            }
            ret[i] = tmp;
        }
        return ret;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

就一个挺垃圾的跑路人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值