506. Relative Ranks的C++解法

来源:互联网 发布:u盘数据丢失恢复 编辑:程序博客网 时间:2024/05/21 17:43

本质就是一个排序问题。考虑到时间复杂度的问题选择了快排,但是好像不是很方便。需要一个额外的索引数组,出于题目限制还要有一个记录原始顺序的数组。感觉空间开销稍微大一点。不过速度还是挺快的。

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;    }};




0 0
原创粉丝点击