第一题:6136. 算术三元组的数目
思路:由于数据量很小,用三重循环遍历一遍即可
class Solution {
public:
int arithmeticTriplets(vector<int>& nums, int diff) {
int res = 0;
int n = nums.size();
for(int i = 0; i < n - 2; i++){
for(int j = i + 1; j < n -1; j++){
for(int k = j + 1; k < n ; k++){
if(nums[j] - nums[i] != diff) k = n - 1;
if(nums[j] - nums[i] == diff && nums[k] - nums[j] == diff) res++;
}
}
}
return res;
}
};
思路:由于是树,一个节点可以指向多个节点,但每个节点都只有一个父亲节点,用无向图来进行存储(这个知识点还不会,在算法基础课里可以学),传参数时带上父亲节点就可以避免重复回去遍历,再满足限制的条件即可
class Solution {
public:
int res = 0;
vector<vector<int>> grid;//构造无向图
vector<bool> limit;//记录限制节点
void dfs(int u,int v){//u为当前节点,v为u的父节点
res++;
for(auto k : grid[u]){
if(k != v && !limit[k]) dfs(k,u);//k不能是父节点,也不能是限制节点
}
}
int reachableNodes(int n, vector<vector<int>>& edges, vector<int>& restricted) {
grid.resize(n);
limit.resize(n);
for(auto &e : edges){
grid[e[0]].push_back(e[1]);
grid[e[1]].push_back(e[0]);
//构造无向图 在算法基础课第二章里
}
for(auto k : restricted) limit[k] = true;
dfs(0,-1);
return res;
}
};
思路:看了题解的线性dp,注意写状态转移方程时要注意条件已经边界,看着代码量较小但现在还没有能力自己写出来
class Solution {
public:
bool validPartition(vector<int>& nums) {
//线性dp
int n = nums.size();
vector<int> dp(n+1);//dp[i+1]表示nums[0]到nums[i]的有效划分
dp[0] = true;//初始化
for(int i = 1; i < n; i++){
if(dp[i-1] && nums[i] == nums[i-1] || i > 1 && dp[i-2] && (nums[i] == nums[i-1] && nums[i] == nums[i-2] || nums[i] == nums[i-1] + 1 && nums[i] == nums[i-2] + 2))
dp[i+1] = true;
}//状态转移方程 三种条件满足一种即可
return dp[n];
}
};