力扣第二弹(628.645.697)

628.三个数的最大乘积

一开始用无脑三层for循化,超时了。后先用快排排序,再分类讨论。

如果全为非负或非正,直接取前三大的数。

如果有负有正,令max为正数。

即三正或一正两负。三正取前三大;两负一正取第一大和最后两个最小负数。

645.错误的集合

注:题干给的形参,每一个都有自己的意义,而且都要用上,不要搞混,即使答案应该正确也是错的。数组类题目如果错了“输出”会显示“]”,即输出不了。

题目本身要分类讨论,当第一个或最后一个数错了要另看。

697.数组的度

这道题有点思维,以下解法需要用到哈希表和二维数组。


#define MAX_N 50100

 

int findShortestSubArray(int* nums, int numsSize){

    int cnt[MAX_N] = {0};

哈希数组存储各元素个数

    int range[MAX_N][2];

第一行存储元素的第一次出现的下标,第二行存储最后一次出现的下标+1。

    memset(range, -1, sizeof(range));

初始化二维数组

    for (int i = 0; i < numsSize; ++i) {

        cnt[nums[i]]++;

        if (range[nums[i]][0] == -1) {

if使其第一次出现时(range[][0]为-1)的下标

            range[nums[i]][0] = i;

 

        }

遍历时,当数字出现时,更新range[][1]的值

        range[nums[i]][1] = i + 1;

    }

    int mx = 0;

表示数组的度

    int ans = numsSize;

    for (int i = 0; i < numsSize; ++i) {

        if (cnt[nums[i]] >= mx) {

            int len = range[nums[i]][1] - range[nums[i]][0];

            if (cnt[nums[i]] > mx) {

把度更大的值赋给mx

                mx = cnt[nums[i]];

                ans = len;

            } else {

当度相等时,把子数组长度更小的赋给ans

                ans = fmin(ans, len);

            }

        }

    }

    return ans;

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值