leetcode第 109 场双周赛
6930. 检查数组是否是好的 - 力扣(LeetCode)
首先判断数组长度是不是最大值 + 1, 然后排个序,判断0到n - 2是不是都是1到最大值的一个排列,满足这些返回true就行了
class Solution {
public:
bool isGood(vector<int>& num) {
int ma = 0;
for(auto i : num){
ma = max(ma, i);
}
if(ma + 1!= num.size())
return false;
sort(num.begin(), num.end());
for(int i = 0;i < num.size() - 2;i ++){
if(num[i] + 1 != num[i + 1])
return false;
}
return true;
}
};
6926. 将字符串中的元音字母排序 - 力扣(LeetCode)
先把s里的元音字母取出来,然后排序,最后替换掉s中的元音字母即可
class Solution {
public:
string sortVowels(string s) {
string os = "";
string yuan = "aeiouAEIOU";
for(auto i : s ){
if(yuan.find(i) != -1){
os += i;
}
}
sort(os.begin(),os.end());
int cnt = 0;
for(int i = 0;i < s.size();i ++){
if(yuan.find(s[i]) != -1){
s[i] = os[cnt++];
}
}
return s;
}
};
6931. 访问数组中的位置使分数最大 - 力扣(LeetCode)
从\(i\)可以跳掉任意\(i < j\)的\(j\)的位置,要使得\(i\)处分数最大,则就是求\(j\)处的分数最大,所以我们可以从最后转移到初始位置,分别从奇数和偶数转移
class Solution {
public:
long long maxScore(vector<int>& nums, int x) {
long long n = nums.size();
vector<vector<long long>> dp(2, vector<long long> (n , 0));
dp[nums[n - 1] & 1][n - 1] = nums[n - 1];
dp[!(nums[n - 1] & 1)][n - 1] = max(0,nums[n - 1] - x);
for(long long i = n - 2;i >= 0;i --){
dp[0][i] = dp[0][i + 1];
dp[1][i] = dp[1][i + 1];
dp[nums[i] & 1][i] += nums[i];
dp[0][i] = max(dp[0][i], dp[1][i] - x);
dp[1][i] = max(dp[1][i], dp[0][i] - x);
}
return dp[nums[0] & 1][0];
}
};
6922. 将一个数字表示成幂的和的方案数 - 力扣(LeetCode)
01 背包模板题。把正整数的 \(x\) 次幂看成一个物品,求的就是把 \(n\) 件物品凑成 \(n\) 的方案数。复杂度 \(\mathcal{O}(n^2)\)
class Solution {
public:
int numberOfWays(int n, int x) {
const int mod = 1e9 + 7;
vector<int> p(n + 1);
for(int i = 1;i <= n;i ++){
long long res = pow(i, x);
p[i] = res % mod;
}
vector<int> dp(n + 1);
dp[0] = 1;
for(int i = 1;i <= n;i ++){
for(int j = n;j >= p[i];j--){
dp[j] = (dp[j] + dp[j - p[i]]) % mod;
}
}
return dp[n];
}
};