置頂

我的 VPython 教學文件 (HackMD 版本)

VPython 教學文件目錄 安裝及測試 基本語法 等速度直線運動 自由落下 終端速度 水平抛射 使用For迴圈計算水平抛射資料 斜向抛射 圓周運動 簡諧運動 單擺 木塊彈簧系統分離 重力及簡諧 行星運動 相疊木塊 雙重簡諧運動 一維彈性碰撞 ...

熱門文章

2026年7月12日 星期日

LeetCode 解題筆記:1331. Rank Transform of an Array

作者:王一哲
日期: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;
    }
};


沒有留言:

張貼留言