Rank: 609 / 2041 AC 2/4
第一次写双周赛,晚上写双周赛的人比周赛的还是少一些的…
数据范围比较小,暴力
时间复杂度 O ( m n ) O(mn) O(mn)
class Solution {
public:
int findTheDistanceValue(vector<int>& arr1, vector<int>& arr2, int d) {
int res = 0;
for(int i=0;i<arr1.size();i++){
int flag = 0;
for(int j=0;j<arr2.size();j++){
if(abs(arr2[j]-arr1[i])<=d) {
flag = 1;break;
}
}
if(!flag) res++;
}
return res;
}
};
参考:无脑查找=。=,方法一般般,好歹过了
这个思路很好,当时写的时候爆内存了…,一直没想到很好的方法来存。
class Solution {
public:
int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
unordered_map<int,unordered_set<int>> s;
for(vector<int> e: reservedSeats){
s[e[0]].insert(e[1]);
}
int res = 0;
unordered_map<int,unordered_set<int>>::iterator it = s.begin();
for(;it!=s.end();it++){
int f = 0;
if(!it->second.count(2)&&!it->second.count(3)&&!it->second.count(4)&&!it->second.count(5)) res++,f =1;
if(!it->second.count(6)&&!it->second.count(7)&&!it->second.count(8)&&!it->second.count(9)) res++,f =1;
if(!it->second.count(4)&&!it->second.count(5)&&!it->second.count(6)&&!it->second.count(7)&&!f) res++;
}
return res + (n-s.size())*2;
}
};
其实如果这个题目不排序的话,那需要那一个map来存一下,然后求topk,时间复杂度下去了,但是空间复杂度会上来。
int fun(int x){
int res = 0;
while(x!=1){
if(x&1){
x = 3*x+1;
}
else {
x /= 2;
}
res++;
}
return res;
}
bool cmp(int a,int b){
int ka = fun(a),kb = fun(b);
if(ka!=kb) return ka < kb;
else return a < b;
}
class Solution {
public:
int getKth(int lo, int hi, int k) {
vector<int> res;
for(int i=lo;i<=hi;i++){
res.push_back(i);
}
sort(res.begin(),res.end(),cmp);
return res[k-1];
}
};
参考:3n 块披萨
可以将问题简化为一个无环的序列,然后计算从3n块披萨挑出互不相连的n块披萨,使和最大
dp[i][j]表示从前i块披萨中选出j块的披萨的最大和
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 2 ] [ j − 1 ] + s l i c e s [ i ] ) i = 1...3 n dp[i][j] = max(dp[i-1][j],dp[i-2][j-1]+slices[i]) \quad i=1...3n dp[i][j]=max(dp[i−1][j],dp[i−2][j−1]+slices[i])i=1...3n
然后考虑环的问题,可以做两次dp操作,一次要头不要尾,另一个要尾不要头。返回两者的最大值。
class Solution {
public:
int calc(vector<int>& slices){
int n = slices.size(), choose = (n+1)/3,x = 0;
int dp[n+1][choose+1];
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=1;j<=choose;j++){
if(i>2) x = dp[i-2][j-1];
else x = 0;
dp[i][j] = max(dp[i-1][j],x+slices[i-1]);
}
}
return dp[n][choose];
}
int maxSizeSlices(vector<int>& slices) {
// f[i][j] 表示到从0到i,从中选出j个最大的
// f[i][j] = max(f[i-1][j],f[i-2][j-1]+slices[i-2])
vector<int> s1(slices.begin(),slices.end()-1);
vector<int> s2(slices.begin()+1,slices.end());
int ans1 = calc(s1), ans2 = calc(s2);
return max(ans1,ans2);
}
};