第一题
暴力枚举
class Solution {
public:
int countKDifference(vector<int>& nums, int k) {
int n = nums.size();
int res = 0;
for (int i=0;i<n;i++)
for (int j=i+1;j<n;j++)
if (abs(nums[i]-nums[j])==k)
res++;
return res;
}
};
第二题
寻找规律,力扣的周赛第二题有规律,普遍为考察排序、前缀和、哈希表、二分、预处理、模拟。
这一道题排序加哈希轻松解决
class Solution {
public:
vector<int> findOriginalArray(vector<int>& ch) {
sort(ch.begin(),ch.end());
unordered_map<int,int> mh;
vector<int> res,s;
for (int x:ch)
{
if (!mh[x])
{
res.push_back(x);
mh[2*x]++;
}
else
mh[x]--;
}
for (auto &[k,v]:mh)
if (v) return s;
return res;
}
};
第三题
经典DP,直接上闫式DP集合分析法,轻松解决。
class Solution {
public:
long long maxTaxiEarnings(int n, vector<vector<int>>& rides) {
long long f[n+10];
vector<pair<int,int>> mh[n+10];
for (auto &x:rides) mh[x[1]].push_back({x[0],x[1]-x[0]+x[2]});
f[0] = 0;
for (int i=1;i<=n;i++)
{
f[i] = f[i-1];
for (auto [s,w]:mh[i])
f[i] = max(f[i],f[s]+w);
}
return f[n];
}
};
第四题
排序加双指针,看懂题意是关键
class Solution
{
public:
int minOperations(vector<int>& a)
{
sort(a.begin(), a.end());
int m = a.size();
a.resize(unique(a.begin(), a.end()) - a.begin());
int n = a.size();
int ret = 0;
int next = 0;
for (int i = 0; i < n; ++i) {
for (; next < n && a[next] - a[i] < m; ++next);
ret = max(ret, next - i);
}
return m - ret;
}
};