2的幂数组中查询范围内的乘积

前言

在刷题中学习语言.

2022/10/15
leetcode第89场双周赛:
题目代号 6209

问题描述:

子域名访问记数

输入输出示例

在这里插入图片描述

问题解析:

  1. 首先解决最小powers数组问题,这里我用了暴力求解(优化空间很大)😅
  2. 然后是遍历累乘,没啥难的

注意的点

  1. power数组是最短的,所以我从最大的开始push_back()
  2. power数组是升序排列,直接使用了sort()
  3. 因为有可能超出int 范围,所以使用long int存储(在这摔惨了)
  4. [0,6]的用例超限,我又把10^9+7多写了一个0,没有起到效果😭,还半天没找出来,最后都要魔怔了
  5. 理所当然的超时…(是比赛时间过了,提交无用)

我的题解

class Solution {
public: 
vector<int> productQueries(int n, vector<vector<int>>& queries) {
    vector<int> powers, res;
    long int m = n;//这里应该不需要long
    long int d;//还有这里
    long int sum = 0;//还有这里
    while (sum < n) {
        long int i = 1;//还有这里
        while (i <= m) {
            i *= 2;
        }
        d = i / 2;
        sum += d;
        powers.push_back(d);
        m = n - sum;
    }
    sort(powers.begin(), powers.end());

    for (auto que : queries) {
        long long int ans = 1;这里不需要long long,只需要下面的取余少一个零
        for (int j = que[0]; j <=que[1]; j++) {
            ans = ans*powers[j]%1000000007;//已经改了😖
        }
        res.push_back(ans);
    }
    return res;
}
};

大佬的题解

来自jerry-chou
采用位运算求power数组

static int mod = 1e9+7;

class Solution {
    int Arr[31], N;//定义幂数组
    
    int lowbit(int x) {
        return x & (-x);//按位与运算(补码)从最低位开始求2幂(看不懂的同学可以去复习一下补码和位运算)
    }
public:
    vector<int> productQueries(int n, vector<vector<int>>& queries) {
        std::vector<int> Ret(queries.size());//定义ans数组
        while (n) {
            Arr[N++] = lowbit(n);
            n -= lowbit(n);//减去求出的2幂(循环得到和为n的最小2的幂数组)
        }
        for (int i = 0;i < queries.size();i++) {//遍历二维数组
            Ret[i] = 1;//预赋值,方便累积
            for (int j = queries[i][0];j <= queries[i][1];j++) {//依照queries数组循环累积
                Ret[i] = (long long)Ret[i] * (long long)Arr[j] % mod;//long long 和取余 防止溢出
            }
        }
        return Ret;
    }
};

测试

在这里插入图片描述

总结

有人相爱,有人夜里看海,有人第一次周赛,第二题都没做出来😭

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

twfplayer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值