质数专题
我的思路就是一个素数筛,然后双指针
class Solution {
public:
int maximumPrimeDifference(vector<int>& nums) {
unordered_map<int, int> mp;
for (int i = 2; i <= 100; i++) {
if (mp[i] == 0) {
for (int j = 2 * i; j <= 100; j += i) {
mp[j] = 1;
}
}
}
mp[1] = 1;
int l = 0, r = nums.size()-1;
int flag = 0;
while (l != r) {
flag = 0;
if (mp[nums[l]]) l++,flag = 1;
if (mp[nums[r]]) r--,flag = 1;
if (!flag) break;
}
return r-l;
}
};
leecode2521
我们可以构造一个质因子的序列(因为数据比较小)
class Solution {
public:
int distinctPrimeFactors(vector<int>& nums) {
vector<int> record[1005];
// 预处理
for (int i = 2; i <= 1000; i++) {
if (record[i].size() == 0) {
for (int j = 2 * i; j <= 1000; j++) {
record[j].push_back(i);
}
}
}
vector<int> vis(1005);
int ans = 0;
for (int u : nums) {
if (record[u].size() == 0) {
if (vis[u] == 0) {
ans++; vis[u] = 1;
}
}
else {
for (int r : record[u]) {
if (vis[r] == 0) {
ans++, vis[r] = 1;
}
}
}
}
return ans;
}
};
阶乘
leecode阶乘后的零
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
for (int i = 5; i <= n; i += 5) {
for (int x = i; x % 5 == 0; x /= 5) {
++ans;
}
}
return ans;
}
};
leecode793阶乘函数后k个零
这一题相较与上一题是一个进阶的题目,如果用暴力是肯定不能过关的
class Solution {
public:
int preimageSizeFZF(int k) {
return find(k + 1) - find(k);
}
long long find(int k) {
long long l = -1, r = 5*k;
while (l + 1 < r) {
long long mid = l + r >> 1;
if (ca(mid) >= k) r = mid;
else l = mid;
}
return r;
}
int ca(long x) {
int ans = 0;
// for (int i = 5; i <= n; i += 5) {
// for (int j = i; j % 5 == 0; j /= 5) {
// ans++;
// }
// } 会超时
while(x){ // 巧妙的算法
ans+= x/5;
x /=5;
}
return ans;
}
};
公约数
leecode 1979
辗转相除法差点忘记了,手动模拟一下
class Solution {
public:
int findGCD(vector<int>& nums) {
int mi , ma; mi = ma = nums[0];
for(int u:nums){
mi = min(mi,u),ma = max(ma,u);
}
if(mi==1) return 1;
int tmp = ma%mi;
while(tmp){
ma = mi;
mi = tmp;
tmp = ma % mi; //小的是答案
}
return mi;
}
};