简单模拟题。统计每行最大值和每列最大值,遍历矩阵,当前位置能够相加的最大数值为:该行最大值和该列最大值中的较小值与当前位置上数的差。
class Solution {
public:
int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) {
int n = grid.size();
vector<int> row(n, 0);
vector<int> col(n, 0);
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
row[i] = max(row[i], grid[i][j]);
col[j] = max(col[j], grid[i][j]);
}
}
int ans = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
ans += min(row[i], col[j]) - grid[i][j];
return ans;
}
};
简单模拟题。对于每一个范围中的数,排序后判定是否为等差数列即可。
class Solution {
public:
vector<bool> checkArithmeticSubarrays(vector<int>& nums, vector<int>& l, vector<int>& r) {
vector<bool> ans;
int len1 = nums.size(), len2 = l.size();
vector<int> temp;
for(int i = 0; i < len2; i++) {
temp.clear();
for(int j = l[i]; j <= r[i]; j++)
temp.push_back(nums[j]);
if(temp.size() == 1)
ans.push_back(true);
else {
bool flag = true;
sort(temp.begin(),temp.end());
int len3 = temp.size();
for(int k = 1; k < len3; k++) {
if(temp[k] - temp[k - 1] == temp[1] - temp[0])
continue;
else {
flag = false;
break;
}
}
ans.push_back(flag);
}
}
return ans;
}
};
简单模拟题。易知将数组排序后,获得的最大值即为数组下标1+3*k的数。
class Solution {
public:
int maxCoins(vector<int>& piles) {
sort(piles.begin(),piles.end());
int len1 = piles.size(), ans = 0, sum = len1 - 2;
for(int i = 0; i < len1 / 3; i++) {
ans += piles[sum];
sum -= 2;
}
return ans;
}
};
深度优先搜索题,简单dfs即可得到答案。
class Solution {
public:
int ans = 0;
int countVowelStrings(int n) {
ans = 0;
for(int i = 1; i <= 5; i++)
dfs(n, 1, i);
return ans;
}
void dfs(int deepth, int now, int pre) {
if(now == deepth)
ans += 1;
else {
for(int i = 1; i <= 5; i++) {
if(i >= pre)
dfs(deepth, now + 1, i);
}
}
}
};