题目描述
想了半天不知道py咋实现这个指针遍历顺序…for转while好麻烦
flag这种或st[] = true/false 以后要多练练
update:
貌似这个会快很多
vector<int> advantageCount(vector<int>& A, vector<int>& B) {
vector<pair<int,int>> v;
for(int i=0;i<B.size();i++)
v.push_back(make_pair(B[i],i));
sort(v.begin(),v.end());
sort(A.begin(),A.end());
vector<int> arr;
int i=0;
int j=0;
while(i<B.size()){
if(A[i]>v[j].first){
B[v[j].second]=A[i];
j++;
i++;
}
else{
A[i]=-1*(A[i]+1);
i++;
}}
for(int i=0;i<B.size();i++){
if(A[i]<0){
B[v[j].second]=-1*A[i]-1;
j++;
}
}
return B;
}
或者
vector<int> advantageCount(vector<int>& A, vector<int>& B) {
int n = A.size();
if(n < 2 ) return A;
sort(A.begin(), A.end());
vector<pair<int,int>> C;
for(int i=0; i<n; ++i)
C.push_back( make_pair(B[i], i));
sort(C.begin(), C.end());
int l = 0, r = n-1;
vector<int> D(n);
for(int i = n-1; i >=0; i--){
if(A[r]<=C[i].first)
D[C[i].second] = A[l++];
else
D[C[i].second] = A[r--];
}
return D;
}
旧版:每次在A里找B的最小值,如果找不到就返回A比它大的最小值。
vector<int> advantageCount(vector<int>& A, vector<int>& B) {
sort(A.begin(), A.end());
vector<int> res;
//res.resize(A.size());
for (int i = 0; i < B.size(); i++)
{
bool flag = false;
for (int j = 0; j < A.size(); j++)
{
if (A[j] > B[i])
{
res.push_back(A[j]);
A.erase(A.begin() + j);
flag = true;
break;
}
}
if (!flag)
{
res.push_back(A[0]);
A.erase(A.begin());
}
}
return res;
}
如果没有A[I]>A[j]应该保证A[0]分给最大的B[j这样的贪心策略才是正确的
没找到的B[j])(注我的code循环里i,j是反着的, 不过词条评论是按你的来)不是随便派哪位A里价格便宜的小姐姐上都可以么.. 也就是说没找到的B[j]派A[0]就行,后面要是有比他大的肯定还是会被派到新的A[0]
而这就数学意义上不改变所有A[i]>B[j]的数量。因为剩下的A数都比价格便宜的A[0]大,所以能尽力最大配对
[2,0,4,1,2]
[1,3,0,0,2],这个样例过不去
你这直接TLE了
英文站上能过。。
垃圾力扣hh
不要自己想,要学习别人的
学习别人的过一两周就忘了。。还得不间断复习才能变成长期记忆…