思路:直接遍历所有点检查是否符合条件即可
class Solution {
public:
bool checkXMatrix(vector<vector<int>>& grid) {
bool x=true;
bool y=true;
int n=grid.size();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j){
if(grid[i][j]==0) x=false;
}
else if(i+j==n-1){
if(grid[i][j]==0) x=false;
}
else {
if(grid[i][j]!=0) y=false;
}
}
}
if(x==true&&y==true) return true;
else return false;
}
};
第二题:2320. 统计放置房子的方式数
思路:设f[i]是前i个地块放置房子的方式数,对于第i个地块有放和不放两种选择,如果放,则第i-1个地块不能放置,则有f[i-2]种,如果不放,则有f[i-1]种放置方式,所以f[i]=f[i-2]+f[i-1],也就是斐波那契额数列求和问题(第一次做动态规划题目,没有思路)
const int N=1e9+7;
class Solution {
public:
int countHousePlacements(int n) {
vector<long long> f(n+1);
f[1]=2;
if(n==1) return f[n]*f[n];
f[2]=3;
if(n==2) return f[n]*f[n];
for(int i=3;i<=n;i++){
f[i]=(f[i-1]+f[i-2])%N;
}
return f[n]*f[n]%N;
}
};
第三题:2321. 拼接数组的最大分数
思路:利用滑动窗口(用双指针来实现)来对比他们哪边贡献多,然后比较对位替换后贡献最大的连续子序列,因为只用返回值,不用管下标,所以直接取值更大的保存,最后返回最大的即可
class Solution {
public:
int maximumsSplicedArray(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size();
int count1=0;
for(int i=0;i<n;i++) count1+=nums1[i];
int count2=0;
for(int i=0;i<n;i++) count2+=nums2[i];
int res1=0,sum1=0;
for(int i=0;i<n;i++){
while(i<n&&sum1>=0){
sum1+=nums1[i]-nums2[i];//对比贡献
i++;
res1=max(res1,sum1);
}
sum1=0;//当贡献为负时清空
i--;//从当前位置继续对比
}
res1+=count2;//与替换的原数组相加
//num2同理
int res2=0,sum2=0;
for(int i=0;i<n;i++){
while(i<n&&sum2>=0){
sum2+=nums2[i]-nums1[i];
i++;
res2=max(res2,sum2);
}
sum2=0;
i--;
}
res2+=count1;
int ans=max(res1,res2);
return ans;
}
};