一.判断矩阵是否是一个X矩阵
1.原题链接:力扣
2.解题思路:对角线的下标满足:i == j || i + j == n - 1
3.参考代码:
class Solution {
public:
bool checkXMatrix(vector<vector<int>>& grid) {
int n = grid.size();
int k =0 ;
for(int i = 0; i < n; i ++)
{
for(int j = 0 ; j < n; j ++)
{
if(i == j || (i + j == n - 1))
{if(grid[i][j] != 0) k ++;}
else if (grid[i][j] == 0) k ++;
}
}
if(k == n * n)return true ;
else return false;
}
};
二.统计放置房子的方式数
1.原题链接:力扣
2.解题思路:街道两侧的地块如何放房子是相互独立的事件,不会受彼此的影响,因而只需要算其中一侧的总情况再平方即可。把f(i)看成前i块地(包括第i块地)放置房子的方案数,对于第i个位置,有放房子和不放两种可能性:若不放房子,那么第(i-1)个地块可放可不放,则有 f[i] = f[i-1];若放房子,那么第(i-1)个地块无法放房子,第(i-2)个地块可放可不放,则有 f[i] = f[i-2]。因此f[i] = f[i-1] + f[i-2]。
3.参考代码:
class Solution {
public:
int countHousePlacements(int n) {
vector<long>f(n + 2);
f[1] = 2;
f[2] = 3;
int mod = 1e9 + 7;
for(int i = 3; i <= n; ++i)
{
f[i] = (f[i - 1] + f[i - 2]) % mod;
}
return f[n] * f[n] % mod;
}
};
三.拼接数组的最大分数
1.原题链接:力扣
2.解题思路:交换后的sumnums1等于交换前的sumnums1加上nums2[i]-nums1[i]同理,交换后的sumnums2等于交换前的sumnums2加上nums1[i]-nums2[i]。需要让交换后的数组的总和最大,一定是让某个区间两个数组的diff差值最大,我们可以将这个diff差值看成一个新的数组arr[],arr[i] = nums1[i] - nums2[i]或nums2[i] - nums1[i],这样问题就转换成了对于一个数组arr[],我们如何求这个数组的最大连续子数组和问题,按照DP的方式递推求解即可。
3.参考代码:
class Solution {
int maxSubarraySum(vector<int>& a, vector<int>& b){
int n = a.size();
int arr[n];
int x;
int maxsum = 0, f = 0;
for(int i = 0; i < n; i++){
arr[i] = a[i] - b[i];
}
for(int x : arr){
f = max(f + x, 0);
maxsum = max(maxsum,f);
}
return maxsum;
}
public:
int maximumsSplicedArray(vector<int>& nums1, vector<int>& nums2) {
int sumnums1 = 0,sumnums2 = 0;
int n = nums1.size();
for(int i = 0; i < n; i++){
sumnums1 += nums1[i];
sumnums2 += nums2[i];
}
sumnums1 += maxSubarraySum(nums2,nums1);
sumnums2 += maxSubarraySum(nums1,nums2);
return max(sumnums1,sumnums2);
}
};