前言
在刷题中学习语言.
2022/10/15
leetcode第89场双周赛:
题目代号 6209
问题描述:
输入输出示例
问题解析:
- 首先解决最小powers数组问题,这里我用了暴力求解(优化空间很大)😅
- 然后是遍历累乘,没啥难的
注意的点
- power数组是最短的,所以我从最大的开始push_back()
- power数组是升序排列,直接使用了sort()
- 因为有可能超出int 范围,所以使用long int存储(在这摔惨了)
- [0,6]的用例超限,我又把10^9+7多写了一个0,没有起到效果😭,还半天没找出来,最后都要魔怔了
- 理所当然的超时…(是比赛时间过了,提交无用)
我的题解
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;
}
};
测试
总结
有人相爱,有人夜里看海,有人第一次周赛,第二题都没做出来😭