递归|模拟
lc825 滑窗
统计各年龄人数,用滑动窗口筛选出满足“年龄Y不小于年龄X一半加7”条件的人群
计算出所有符合要求的好友请求总数
if (cnt_window > 0) { // 可发
ans += cnt[age_x] * cnt_window - cnt[age_x]; //自己不可以给自己发

class Solution {
public:
int numFriendRequests(vector<int>& ages) {
int cnt[121]{};
for (int age : ages) {
cnt[age]++;
}
int ans = 0, cnt_window = 0, age_y = 0;
for (int age_x = 0; age_x < 121; age_x++) {
cnt_window += cnt[age_x];
if (age_y * 2 <= age_x + 14) { // 不可发
cnt_window -= cnt[age_y];
age_y++;
}
if (cnt_window > 0) { // 可发
ans += cnt[age_x] * cnt_window - cnt[age_x]; //自己不可以给自己发
}
}
return ans;
}
};
lc2437
乘法原理
先分别算出时间小时部分和分钟部分符合格式的可能数
再将两者相乘得到总的可能时间数
count(time.substr(0, 2), 24) * count(time.substr(3), 60);

class Solution {
int count(string t, int period)
{
int ans = 0;
for (int i = 0; i < period; i++)
if ((t[0] == '?' || i / 10 == t[0] - '0') &&
(t[1] == '?' || i % 10 == t[1] - '0'))
ans++;
return ans;
}
public:
int countTime(string time) {
return count(time.substr(0, 2), 24) * count(time.substr(3), 60);
}
};
lc2028
if (i < remainder)
result.push_back(avg + 1);
先算出缺失数据的总和,再判断是否在合理范围,若在就把总和平均分并调整余数,生成符合骰子点数(1 - 6)的缺失数据
#include <vector>
using namespace std;
class Solution {
public:
vector<int> missingRolls(vector<int>& rolls, int mean, int n) {
int m = rolls.size();
int target = mean * (m + n);
int sum = 0;
for (int num : rolls) {
sum += num;
}
int missingSum = target - sum;
// 检查缺失总和是否在合理范围内
if (missingSum < n || missingSum > 6 * n) {
return {};
}
vector<int> result;
int avg = missingSum / n;
int remainder = missingSum % n;
// 生成缺失的观测数据
for (int i = 0; i < n; ++i) {
if (i < remainder) {
result.push_back(avg + 1);
} else {
result.push_back(avg);
}
}
return result;
}
};
lc779
抽象为 树

class Solution {
public:
int kthGrammar(int n, int k) {
if (n == 1) return 0;
int ret = kthGrammar(n - 1, (k + 1)/2);
if (ret == 0) {
return k % 2 ? 0 : 1;
} else {
return k % 2 ? 1 : 0;
}
}
};
翻转_找规律

class Solution {
public:
int kthGrammar(int N, int K)
{
if(N == 1)return 0; //出口
// 计算当前行的长度:2的N-1次方
int length = pow(2 ,(N - 1));
// 如果K大于长度的一半,就是K所在位置是后半段
if(K > length / 2){
// 先得到上一行的值,位置是K相对于后半段的位置
int val = kthGrammar(N - 1, K - length / 2);
// 然后把值反过来
return val == 0 ? 1 : 0;
}
// 否则前半部分
else{
// 值就是上一行K位置的值
return kthGrammar(N - 1, K);
}
}
};
