本质就是一个排序问题。考虑到时间复杂度的问题选择了快排,但是好像不是很方便。需要一个额外的索引数组,出于题目限制还要有一个记录原始顺序的数组。感觉空间开销稍微大一点。不过速度还是挺快的。
class Solution {
public:
vector<int> id;
void quickSort(vector<int>& s, int l, int r){
if (l < r)
{
int i = l, j = r, x = s[l], p = id[l];
while (i < j)
{
while (i < j && s[j] <= x) j--;
if (i < j)
{
id[i] = id[j];
s[i++] = s[j];
}
while (i < j && s[i] > x) i++;
if (i < j)
{
id[j] = id[i];
s[j--] = s[i];
}
}
s[i] = x;
id[i] = p;
quickSort(s, l, i - 1);
quickSort(s, i + 1, r);
}
}
vector<string> findRelativeRanks(vector<int>& nums) {
vector<int>copy;
vector<string> result;
result.resize(nums.size());
for (int i = 0; i < nums.size(); i++)
{
id.push_back(i);
copy.push_back(nums[i]);
}
quickSort(nums, 0, nums.size()-1);
result[id[0]] = "Gold Medal";
if (nums.size()>1){
result[id[1]] = "Silver Medal";
if (nums.size() > 2){
result[id[2]] = "Bronze Medal";
for (int i = 3; i < nums.size(); i++)
{
result[id[i]] = to_string(i+1);
}
}
}
return result;
}
};1.快排的时候注意索引数组也要跟着改变和调整。这个时候有个写法问题,如s[i++]=s[j],赋值的同时i值也变了,再执行id[i]=id[j]其实是错的。
2.返回最终结果之前判断上下界,有时候人数小于3并没有银牌、铜牌什么的
3.vector数组不可以直接对下标进行操作(没有开辟空间),如果想这么做要先resize到足够大小。
这个算法感觉比较拧巴,又写了一个按照自己思路来的插排。本来想着可以只改变rank数组不改变原始数组,但当前面的已排数据不是按照升序的话会出现错误(1,3,2,5,4)
最优解算法:
使用了优先队列和make_pair。
优先队列在push入每一个元素的时候都会进行动态调整,使得队列的top都是队列中的最大值。make_pair可以理解为将两个关联起来。
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& nums) {
priority_queue<pair<int,int> > pq;
for(int i=0;i<nums.size();i++)
{
pq.push(make_pair(nums[i],i));
}
vector<string> res(nums.size(),"");
int count = 1;
for(int i=0; i<nums.size();i++)
{
if(count==1) {res[pq.top().second] = "Gold Medal"; count++;}
else if(count==2) {res[pq.top().second] = "Silver Medal"; count++;}
else if(count==3) {res[pq.top().second] = "Bronze Medal"; count++;}
else {res[pq.top().second] = to_string(count); count++;}
pq.pop();
}
return res;
}
};
本文探讨了一种基于快速排序算法的竞赛排名实现方案,并提出了一种更优解——利用优先队列和pair组合来提高效率。文章详细介绍了两种方法的具体实现过程及注意事项。
363

被折叠的 条评论
为什么被折叠?



