1534.统计好三元组
枚举,时间复杂度:O(n3)
class Solution {
public:
int countGoodTriplets(vector<int>& arr, int a, int b, int c) {
int n = arr.size();
int cnt = 0;
for(int i = 0; i < n; i ++ ){
for(int j = i + 1; j < n; j ++ ){
for(int k = j + 1; k < n; k ++ ){
cnt += abs(arr[i] - arr[j]) <= a && abs(arr[j] - arr[k]) <= b && abs(arr[i] - arr[k]) <= c ;
}
}
}
return cnt;
}
};
1535.找出数组游戏的赢家
模拟+贪心,时间复杂度:O(n)
class Solution {
public:
unordered_map<int, int> mp;
int getWinner(vector<int>& arr, int k) {
int n = arr.size();
int i = 0, j = 1;
while(true){
if(arr[i] > arr[j]){
mp[arr[i]] ++ ;
if(mp[arr[i]] == k) return arr[i];
j ++ ;
}else{
mp[arr[j]] ++ ;
if(mp[arr[j]] == k) return arr[j];
i = j; j ++ ;
}
if(j == n) return arr[i];
}
return 0;
}
};
1536.排布二进制网格的最少交换次数
贪心,时间复杂度:O(n2)
class Solution {
public:
unordered_map<int, int> mp;
static const int N = 210;
int minSwaps(vector<vector<int>>& grid) {
int n = grid.size();
for(int i = 0; i < n; i ++ ){
int cnt = 0;
bool flag = true;
for(int j = n - 1; j >= 0; j -- ){
if(grid[i][j]) flag = false;
if(flag) cnt += (grid[i][j] == 0);
}
mp[i] = cnt;
}
int res = 0;
int st = 0;
for(int i = n - 1; i >= 1; i -- ){
int minv = 0x3f3f3f3f, index = -1;
for(int j = st; j < n; j ++ ){
if(mp[j] >= i && minv > j - st) index = j, minv = j - st;
}
if(index == -1) return -1;
for(int j = index; j > st; j -- ) mp[j] = mp[j - 1];
res += minv;
st ++ ;
}
return res;
}
};
1537.最大得分
贪心+双指针,时间复杂度:O(n+m)
class Solution {
public:
typedef long long ll;
static const ll N = 1E5 + 10, MOD = 1E9 + 7;
unordered_map<int, int> mp1;
typedef pair<int, int> pii;
unordered_map<int, pii> p;
int maxSum(vector<int>& nums1, vector<int>& nums2) {
int n1 = nums1.size(), n2 = nums2.size();
for(int i = 0; i < n1; i ++ ) mp1[nums1[i]] = i;
for(int i = 0; i < n2; i ++ ) if(mp1.find(nums2[i]) != mp1.end()) p[nums2[i]] = {mp1[nums2[i]], i};
ll maxv1 = 0;
ll maxv2 = 0;
int st0 = 0, st1 = 0;
while(st0 < n1){
maxv1 = (maxv1 + nums1[st0]);
if(p.find(nums1[st0]) != p.end()){
int ed = p[nums1[st0]].second;
while(st1 <= ed){
maxv2 = (maxv2 + nums2[st1]);
st1 ++ ;
}
maxv1 = max(maxv1, maxv2);
maxv2 = maxv1;
}
st0 ++ ;
}
while(st1 < n2){
maxv2 = (maxv2 + nums2[st1]);
st1 ++ ;
}
return max(maxv1, maxv2) % MOD;
}
};