851 喧鬧和富有

2021-10-12 16:06:24 字數 1870 閱讀 3365

題目描述:

在一組 n 個人(編號為 0, 1, 2, …, n-1)中,每個人都有不同數目的錢,以及不同程度的安靜(quietness)。

為了方便起見,我們將編號為 x 的人簡稱為 "person x "。

如果能夠肯定 person x 比 person y 更有錢的話,我們會說 richer[i] = [x, y] 。注意 richer 可能只是有效觀察的乙個子集。

另外,如果 person x 的安靜程度為 q ,我們會說 quiet[x] = q 。

現在,返回答案 answer ,其中 answer[x] = y 的前提是,在所有擁有的錢不少於 person x 的人中,person y 是最安靜的人(也就是安靜值 quiet[y] 最小的人)。

示例:

輸入:richer = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet = [3,2,5,4,6,1,7,0]

輸出:[5,5,2,5,4,5,6,7]

解釋:answer[0] = 5,

person 5 比 person 3 有更多的錢,person 3 比 person 1 有更多的錢,person 1 比 person 0 有更多的錢。

唯一較為安靜(有較低的安靜值 quiet[x])的人是 person 7,

但是目前還不清楚他是否比 person 0 更有錢。

answer[7] = 7,

在所有擁有的錢肯定不少於 person 7 的人中(這可能包括 person 3,4,5,6 以及 7),

最安靜(有較低安靜值 quiet[x])的人是 person 7。

其他的答案也可以用類似的推理來解釋。

1 <= quiet.length = n <= 500

0 <= quiet[i] < n,所有 quiet[i] 都不相同。

0 <= richer.length <= n * (n-1) / 2

0 <= richer[i][j] < n

richer[i][0] != richer[i][1]

richer[i] 都是不同的。

對 richer 的觀察在邏輯上是一致的。

方法1:

(1)先根據富有關係,建立鄰接表的圖,然後對每個需要判讀的結點 ,從該節點出發,遍歷該圖,並在遍歷的過程中,找出最小的quite的索引;

(2)為了避免每次遍歷都需要遍歷所有的結果,這裡可以提前將已經在之前遍歷過程中,找到的中間值直接儲存到結果,減少搜尋的深度;

class

solution

int cur=index;

//當前索引能找到的最小的quite 的索引

for(

int& m:mp[index])}

return cur;

//返回當前結點index的最小的quite的索引

} vector<

int>

loudandrich

(vectorint>>

& richer, vector<

int>

& quiet)

vector<

int>

res(quiet.

size()

);//初始化返回結果,都為自己的索引

for(

int i=

0;isize()

;++i)

//找出各個結點的對應的最小的quite

for(

int i=

0;isize()

;++i)

}return res;}}

;

851 喧鬧和富有

在一組 n 個人 編號為0,1,2,n 1 中,每個人都有不同數目的錢,以及不同程度的安靜 quietness 為了方便起見,我們將編號為x的人簡稱為 personx 如果能夠肯定 personx比 persony更有錢的話,我們會說richer i x,y 注意richer可能只是有效觀察的乙個子...

851 喧鬧和富有

讀完題後,感覺是個有向圖,我的理解是對於乙個點 這裡即所謂person 取所有能走到這個點的點裡對應的quiet最小的點。找能到達點x的點集中最小quiet的這個過程可定義為func x 這樣問題就簡化為了對點x,找與x有直接關聯的 即存在於richer陣列中 的點集ys中的min func y 可...

851 喧鬧和富有

在一組 n 個人 編號為 0,1,2,n 1 中,每個人都有不同數目的錢,以及不同程度的安靜 quietness 為了方便起見,我們將編號為 x 的人簡稱為 person x 如果能夠肯定 person x 比 person y 更有錢的話,我們會說 richer i x,y 注意 richer 可...