使所有元素都可以被 3 整除的最少操作
class Solution {
public:
int minimumOperations(vector<int>& nums) {
int len = nums.size();
int ans = 0;
for(int i = 0; i < len; i++){
if(nums[i] % 3)
ans += 1;
}
return ans;
}
};
使二进制数组全部等于 1 的最少操作次数 I
改变一个0,后面的状态不确定,所以只能递推,最后判断a[n -1] 和 a[n -2 ]即可完成判定
class Solution {
public:
int minOperations(vector<int>& nums) {
int n = nums.size();
int ans = 0;
for(int i = 0; i < n - 2; i++) {
if(nums[i] == 1)
continue;
ans ++;
nums[i] = 1;
nums[i + 1] ^= 1;
nums[i + 2] ^= 1;
}
if(nums[n - 1] == 0 || nums[n - 2] == 0)
return -1;
return ans;
}
};
使二进制数组全部等于 1 的最少操作次数 II
请你返回将 nums
中所有元素变为 1 的 最少 操作次数,选择数组中 任意 一个下标 i
,并将从下标 i
开始一直到数组末尾 所有 元素 反转
class Solution {
public:
int minOperations(vector<int>& nums) {
int n = nums.size();
int cnt = 0;
int f = -1;
for(int i = 0; i < n; i ++){
if(nums[i] == 0){
f = i;
break;
}
}
if(f == -1)
return 0;
for(int i = f; i < n; i++) {
int t = nums[i];
while(i + 1 < n && nums[i + 1] == t){
i ++;
}
cnt ++;
}
return cnt;
}
};
统计逆序对的数目
给你一个整数 n
和一个二维数组 requirements
,其中 requirements[i] = [endi, cnti]
表示这个要求中的末尾下标和 逆序对 的数目。
整数数组 nums
中一个下标对 (i, j)
如果满足以下条件,那么它们被称为一个 逆序对 :
i < j
且nums[i] > nums[j]
long long dp[305][405];
long long pmod = 1000000007;
int a[305];
class Solution {
public:
int numberOfPermutations(int n, vector<vector<int>>& r) {
int i,j,k;
memset(a, -1, sizeof(a));
for (i=0;i<r.size();++i) {
a[r[i][0] + 1] = r[i][1];
}
for (i=0;i<=n;++i) {
for (j=0;j<405;++j) {
dp[i][j] = 0;
}
}
dp[0][0] = 1;
for (i=0;i<n;++i) {
for (j=0;j<405;++j) {
if (dp[i][j] == 0) {
continue;
}
if (a[i] != -1 && j != a[i]) {
continue;
}
for (k=0; k<=i && k + j < 405;++k) {
dp[i+1][k+j] += dp[i][j];
dp[i+1][k+j] %= pmod;
}
}
}
return dp[n][a[n]];
}
};