【算法分析與設計】【第六週】690. Employee Importance

題目來源:https://leetcode.com/problems/employee-importance/description/

小題大做。

題目大意

有一種員工信息的數據結構,其中包括員工的唯一ID,他的重要度和他的直系下屬的ID。
現給出員工id,計算該員工及其所有下屬的重要度之和。

// Employee info
class Employee {
public:
    // It's the unique ID of each node.
    // unique id of this employee
    int id;
    // the importance value of this employee
    int importance;
    // the id of direct subordinates
    vector<int> subordinates;
};

例:
Input: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1
Output: 11
解釋:
員工 1 的重要度爲 5 , 並擁有直系下屬員工 2 和員工 3;員工 2 的重要度爲 3 , 不擁有直系下屬;員工 3 的重要度爲 3 , 不擁有直系下屬。
計算員工 1 及其所有下屬的重要度之和 = 。


思路

1.把圖建起來

容易看出,這是一個有向圖。這裏我們用鄰接矩陣表示。
主對角線存員工重要度值。並用有向邊表示上下屬關係。

2.進行DFS

將得到的員工id作爲DFS起點,進行一遍DFS。
與普通DFS不同的是,這裏增加一個count變量,用於計算重要度之和。
一遍DFS可找到包含該起點的連通分量。連通分量中的每一個頂點,可在圖(鄰接矩陣)中找到這些頂點的重要度,併疊加。
最終得到的count即該員工及其所有下屬的重要度之和。


代碼

注:

  • 由於題目沒有說明員工id是否可以爲0,所以數組下標都是直接按員工id來處理的,並沒有進行類似(id-1)的操作。
  • 爲防止數組越界,將行列最大值設置爲比題目陳述的最大員工數2000還大1的2001。

#define MAX 2001
int visited[MAX];        

class Solution {
public:
    int getImportance(vector<Employee*> employees, int id) {
        for (int i = 0; i < MAX; i++) visited[i] = 0;
        int size = employees.size();  
        vector<int> mm(MAX, 0);
        vector<vector<int>> M(MAX, mm);    
        // initialization
        for (int i = 0; i < MAX; i++)
            for (int j = 0; j < MAX; j++)
                M[i][j] = 0;
        // construct the graph
        for (int i = 0; i < size; i++) {
            int index = employees[i]->id;
            M[index][index] = employees[i]->importance;   // store the importance
            for (int j = 0; j < (employees[i]->subordinates).size(); j++) {
                M[index][(employees[i]->subordinates)[j]] = 1;   // sign the relationship
            }
        }   
        int sum = DFS(M, MAX, MAX, id);
        return sum;   
    }

    int DFS(vector<vector<int>> M, int MRowSize, int MColSize, int v) {
        int count = M[v][v];
        visited[v] = 1;  // begin with v
        stack<int> mys;
        mys.push(v);
        while (!mys.empty()) {
            int temp = mys.top();
            mys.pop();
            for (int i = 0; i < MRowSize; i++) {
                if (M[temp][i] != 0 && visited[i] == 0) {
                    count += M[i][i];
                    mys.push(i);
                    visited[i] = 1;
                }
            }
        }
        return count;
    } 
};



遇到的問題

總是提示“Runtime Error ”。但是反覆查驗並沒有發現問題。
經測試,類似 M[i][j] = 0; 這樣的賦值語句通不過leetcode的檢測。
但是類似 M[0][0] = 0; 這樣的賦值語句卻可以行得通。
我猜想,可能是leetcode不支持二維數組的行列號爲變量這種方式的賦值?
我也搞不明白,還要和同學進行交流,繼續跟進這道題目。


其它解法

利用HashMap映射

wjx_sky對這道題進行了深入的探索,提供了“用hashMap將id與其對應的數據結構映射起來,找到id對應的員工信息並將其加入到一個隊列中”這一思路。

更簡潔的dfs寫法

當然,對於dfs的思路,還有更簡潔的寫法

發佈了29 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章