日期:2026年7月12日
LeetCode 題目連結:1331. Rank Transform of an Array
解題想法
簡單題。題目給一個陣列 $arr$,要將陣列中數字對應的排名組成陣列後再回傳陣列。我先將原來的陣列複製一份,將複製後的陣列排序,從排序後的陣列讀取數字、找出對應的排名,將數字、排名存入字典之中。最後再從原來的陣列依序讀取數字,從字典中找出對應的排名並組成陣列。
Python 程式碼
Runtime: 43 ms, beats 49.41%. Memory: 37.60 MB, beats 60.61%.
class Solution:
def arrayRankTransform(self, arr: List[int]) -> List[int]:
sorted_arr = sorted(arr) # 複製一份 arr 的資料並排序
rank = dict() # 用來儲存數字對應的排名
idx = 0 # 排名
curr = float('-inf') # 目前排名的數字
for a in sorted_arr: # 從排序後的串列讀取數字
if a > curr: # 如果 a 大於 curr
idx += 1 # 排名加 1
curr = a # 更新 curr
rank[a] = idx # 更新 a 對應的排名
return [rank[a] for a in arr] # 依序從 arr 讀取數字、轉成排名、組成串列
C++ 程式碼
Runtime: 35 ms, beats 88.64%. Memory: 45.31 MB, beats 20.80%.
class Solution {
public:
vector<int> arrayRankTransform(vector<int>& arr) {
// 複製一份 arr 的資料並排序
vector<int> sorted_arr (arr.begin(), arr.end());
sort(sorted_arr.begin(), sorted_arr.end());
unordered_map<int, int> rank; // 用來儲存數字對應的排名
int idx = 0, curr = -1000000001; // 排名、目前排名的數字
for(int a : sorted_arr) { // 從排序後的陣列讀取數字
if (a > curr) { // 如果 a 大於 curr
idx++; // 排名加 1
curr = a; // 更新 curr
}
rank[a] = idx; // 更新 a 對應的排名
}
// 依序從 arr 讀取數字、轉成排名、組成陣列
vector<int> ans;
for(int a : arr) {
ans.push_back(rank[a]);
}
return ans;
}
};
沒有留言:
張貼留言