leetcode第354场周赛 2 - 双指针 3 - 思维 4 - 待补
2779. 数组的最大美丽值
题意
给你一个数组和一个整数 k,数组里面每个数都只能操作一次:加上区间\([-k,k]\)里的数。问你最终由相等元素组成的最长子序列的长度
双指针的妙用!
思路
先排序,前后双指针取差值在2k之间的区间,此区间的所有数均可以操作为同一个数,ans统计最大值即为最终答案
代码
class Solution {
public:
int maximumBeauty(vector<int>& a, int k) {
sort(a.begin() , a.end());
int ans = 1 , n = a.size();
k <<= 1;
for(int i = 0, j = 0; i < n; ++ i){
while(a[i] > a[j] + k) ++ j;
ans = max(ans, i - j + 1);
}
return ans;
}
};
2780. 合法分割的最小下标
题意
定义支配元素为数组中出现次数 * 2 大于数组长度的数。请你将数组在某个下标处划分为两个数组,且数组左右的支配元素相同。无法分割返回 -1
思路
思路来自灵茶山艾府,关键在于发现,划分后左右的众数就是整体的众数
那么,$O(n) $ 找众数,$O(n) $判下标即可
代码
class Solution {
public:
int minimumIndex(vector<int>& a) {
unordered_map<int,int> cnt;
for(auto x : a){
++cnt[x];
}
unordered_map<int,int> t;
int n = a.size();
for(int i = 0; i < n; ++ i){
++ t[a[i]];
if(t[a[i]] * 2 > i + 1 && (cnt[a[i]] - t[a[i]]) * 2 > n - i - 1){
return i;
}
}
return -1;
}
};
本文来自博客园,作者:Qiansui,转载请注明原文链接:https://www.cnblogs.com/Qiansui/p/17578629.html