Skip to content

Commit 1f8b0f4

Browse files
committed
1583. Count Unhappy Friends: AC
1 parent b42d1d0 commit 1f8b0f4

File tree

2 files changed

+169
-0
lines changed

2 files changed

+169
-0
lines changed

src/solution/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1193,3 +1193,4 @@ mod s1577_number_of_ways_where_square_of_number_is_equal_to_product_of_two_numbe
11931193
mod s1578_minimum_time_to_make_rope_colorful;
11941194
mod s1579_remove_max_number_of_edges_to_keep_graph_fully_traversable;
11951195
mod s1582_special_positions_in_a_binary_matrix;
1196+
mod s1583_count_unhappy_friends;
+168
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
/**
2+
* [1583] Count Unhappy Friends
3+
*
4+
* You are given a list of preferences for n friends, where n is always even.
5+
* For each person i, preferences[i] contains a list of friends sorted in the order of preference. In other words, a friend earlier in the list is more preferred than a friend later in the list. Friends in each list are denoted by integers from 0 to n-1.
6+
* All the friends are divided into pairs. The pairings are given in a list pairs, where pairs[i] = [xi, yi] denotes xi is paired with yi and yi is paired with xi.
7+
* However, this pairing may cause some of the friends to be unhappy. A friend x is unhappy if x is paired with y and there exists a friend u who is paired with v but:
8+
*
9+
* x prefers u over y, and
10+
* u prefers x over v.
11+
*
12+
* Return the number of unhappy friends.
13+
*
14+
* Example 1:
15+
*
16+
* Input: n = 4, preferences = [[1, 2, 3], [3, 2, 0], [3, 1, 0], [1, 2, 0]], pairs = [[0, 1], [2, 3]]
17+
* Output: 2
18+
* Explanation:
19+
* Friend 1 is unhappy because:
20+
* - 1 is paired with 0 but prefers 3 over 0, and
21+
* - 3 prefers 1 over 2.
22+
* Friend 3 is unhappy because:
23+
* - 3 is paired with 2 but prefers 1 over 2, and
24+
* - 1 prefers 3 over 0.
25+
* Friends 0 and 2 are happy.
26+
*
27+
* Example 2:
28+
*
29+
* Input: n = 2, preferences = [[1], [0]], pairs = [[1, 0]]
30+
* Output: 0
31+
* Explanation: Both friends 0 and 1 are happy.
32+
*
33+
* Example 3:
34+
*
35+
* Input: n = 4, preferences = [[1, 3, 2], [2, 3, 0], [1, 3, 0], [0, 2, 1]], pairs = [[1, 3], [0, 2]]
36+
* Output: 4
37+
*
38+
*
39+
* Constraints:
40+
*
41+
* 2 <= n <= 500
42+
* n is even.
43+
* preferences.length == n
44+
* preferences[i].length == n - 1
45+
* 0 <= preferences[i][j] <= n - 1
46+
* preferences[i] does not contain i.
47+
* All values in preferences[i] are unique.
48+
* pairs.length == n/2
49+
* pairs[i].length == 2
50+
* xi != yi
51+
* 0 <= xi, yi <= n - 1
52+
* Each person is contained in exactly one pair.
53+
*
54+
*/
55+
pub struct Solution {}
56+
57+
// problem: https://leetcode.com/problems/count-unhappy-friends/
58+
// discuss: https://leetcode.com/problems/count-unhappy-friends/discuss/?currentPage=1&orderBy=most_votes&query=
59+
60+
// submission codes start here
61+
62+
impl Solution {
63+
pub fn unhappy_friends(n: i32, preferences: Vec<Vec<i32>>, pairs: Vec<Vec<i32>>) -> i32 {
64+
let n = n as usize;
65+
let mut memo = vec![0; n];
66+
for arr in &pairs {
67+
let a = arr[0] as usize;
68+
let b = arr[1] as usize;
69+
memo[a] = b;
70+
memo[b] = a;
71+
}
72+
73+
let mut result = 0;
74+
for arr in pairs {
75+
let a = arr[0] as usize;
76+
let b = arr[1] as usize;
77+
78+
let mut flag = false;
79+
for &u in &preferences[a] {
80+
let u = u as usize;
81+
if u == b {
82+
break;
83+
}
84+
85+
let v = memo[u];
86+
for &candidate in &preferences[u] {
87+
let candidate = candidate as usize;
88+
if candidate == a {
89+
flag = true;
90+
break;
91+
} else if candidate == v {
92+
break;
93+
}
94+
}
95+
96+
if flag {
97+
result += 1;
98+
break;
99+
}
100+
}
101+
102+
let mut flag = false;
103+
for &u in &preferences[b] {
104+
let u = u as usize;
105+
if u == a {
106+
break;
107+
}
108+
109+
let v = memo[u];
110+
for &candidate in &preferences[u] {
111+
let candidate = candidate as usize;
112+
if candidate == b {
113+
flag = true;
114+
break;
115+
} else if candidate == v {
116+
break;
117+
}
118+
}
119+
120+
if flag {
121+
result += 1;
122+
break;
123+
}
124+
}
125+
}
126+
result
127+
}
128+
}
129+
130+
// submission codes end
131+
132+
#[cfg(test)]
133+
mod tests {
134+
use super::*;
135+
136+
#[test]
137+
fn test_1583_example_1() {
138+
let n = 4;
139+
let preferences = vec![vec![1, 2, 3], vec![3, 2, 0], vec![3, 1, 0], vec![1, 2, 0]];
140+
let pairs = vec![vec![0, 1], vec![2, 3]];
141+
142+
let result = 2;
143+
144+
assert_eq!(Solution::unhappy_friends(n, preferences, pairs), result);
145+
}
146+
147+
#[test]
148+
fn test_1583_example_2() {
149+
let n = 2;
150+
let preferences = vec![vec![1], vec![0]];
151+
let pairs = vec![vec![1, 0]];
152+
153+
let result = 0;
154+
155+
assert_eq!(Solution::unhappy_friends(n, preferences, pairs), result);
156+
}
157+
158+
#[test]
159+
fn test_1583_example_3() {
160+
let n = 4;
161+
let preferences = vec![vec![1, 3, 2], vec![2, 3, 0], vec![1, 3, 0], vec![0, 2, 1]];
162+
let pairs = vec![vec![1, 3], vec![0, 2]];
163+
164+
let result = 4;
165+
166+
assert_eq!(Solution::unhappy_friends(n, preferences, pairs), result);
167+
}
168+
}

0 commit comments

Comments
 (0)