แนวคิด
สมมติว่ามีรายการคะแนนของนักกีฬา N คน ให้หา relative ranks และคนที่ได้คะแนนสูงสุด 3 อันดับแรก จะได้เหรียญ "Gold", "Silver" และ "Bronze"
เช่น ถ้าอินพุตคือ [2,5,3,1,0] ผลลัพธ์คือ [Bronze, Gold, Silver, 4, 5]
วิธีแก้:
- ถ้าขนาด nums เท่ากับ 1: คืนค่า "Gold"
- ถ้าขนาด nums เท่ากับ 2: ถ้า nums[0] > nums[1]: คืนค่า "Gold", "Silver" มิฉะนั้น: คืนค่า "Silver", "Gold"
- กำหนดอาร์เรย์ v
- กำหนดอาร์เรย์ vec
- วนลูป i := 0 ถึงขนาด nums - 1: แทรก nums[i] ลงท้าย v
- เรียงอาร์เรย์ v
- กลับลำดับอาร์เรย์ v
- กำหนด map mp
- ถ้าขนาด nums > 2: แทรก {v[0], "Gold"} ลง mp, {v[1], "Silver"} ลง mp, {v[2], "Bronze"} ลง mp, วนลูป i := 3 ถึงขนาด v - 1: แทรก {v[i], i+1 เป็นสตริง} ลง mp, วนลูป i := 0 ถึงขนาด nums - 1: แทรก mp[nums[i]] ลงท้าย vec
- คืนค่า vec
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v) {
cout << "[";
for(int i = 0; i<v.size(); i++) {
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& nums) {
if (nums.size() == 1) { return {"Gold"}; }
if (nums.size() == 2) {
if (nums[0] > nums[1]) return {"Gold", "Silver"};
else return {"Silver", "Gold"};
}
vector<int> v;
vector<string> vec;
for (int i = 0; i < nums.size(); i++) v.push_back(nums[i]);
sort(v.begin(), v.end());
reverse(v.begin(), v.end());
map<int, string> mp;
if (nums.size() > 2) {
mp.insert({v[0], "Gold"});
mp.insert({v[1], "Silver"});
mp.insert({v[2], "Bronze"});
for (int i = 3; i < v.size(); i++) {
mp.insert({v[i], to_string(i + 1)});
}
for (int i = 0; i < nums.size(); i++) vec.push_back(mp[nums[i]]);
}
return vec;
}
};
main() {
Solution ob;
vector<int> v = {2,5,3,1,0};
print_vector(ob.findRelativeRanks(v));
}
อินพุต
{2,5,3,1,0}
เอาต์พุต
[Bronze, Gold, Silver, 4, 5, ]