LeetCode 1601. 最多可达成的换楼请求数目 题目链接 1601. 最多可达成的换楼请求数目
题解思路 状态压缩,根据数据范围可以得出,假设请求长度为m,就是有m个请求,那么就有 1 << m
种情况
直接遍历每种情况,求出最大符合条件的情况
代码 python3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class Solution : def maximumRequests (self, n: int , requests: List [List [int ]] ) -> int : m = len (requests) res = 0 def GetCnt (x ): s = 0 while x: if x & 1 : s += 1 x = x >> 1 return s def check (x: int ) -> bool : cnt = [0 ] * n for i in range (m): if (x >> i) & 1 : a = requests[i][0 ] b = requests[i][1 ] cnt[a] = cnt[a] - 1 cnt[b] = cnt[b] + 1 for i in cnt: if i:return False return True for i in range ((1 << m)): x = GetCnt(i) if x <= res: continue if check(i): res = x return res
java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 class Solution { int n, m; int [][] rs; public int maximumRequests (int n, int [][] requests) { this .n = n; rs = requests; m = rs.length; int res = 0 ; for (int i = 0 ; i < (1 << m); i++){ int x = GetCnt(i); if (x <= res)continue ; if (check(i))res = x; } return res; } public int GetCnt (int x) { int s = 0 ; for (int i = x; i > 0 ; i -= (i & -i)) s++; return s; } public boolean check (int x) { int [] cnt = new int [n]; for (int i = 0 ; i < m; i++){ if (((x >> i) & 1 ) == 1 ){ int a = rs[i][0 ], b = rs[i][1 ]; cnt[a] --; cnt[b] ++; } } for (int i = 0 ; i < n; i++)if (cnt[i] != 0 )return false ; return true ; } }
c++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 class Solution { vector<vector<int >> rs; int n; public : int GetCnt (int x) { int s = 0 ; for (int i = x; i > 0 ; i -= (i & -i)){ s ++; } return s; } bool check (int x) { vector<int > cnt (n) ; for (int i = 0 ; i < rs.size (); i++){ if (((x >> i) & 1 ) == 1 ){ int a = rs[i][0 ], b = rs[i][1 ]; cnt[a]--; cnt[b]++; } } for (int i = 0 ; i < n; i++){ if (cnt[i] != 0 )return false ; } return true ; } int maximumRequests (int n, vector<vector<int >>& requests) { rs = requests; this ->n = n; int m = rs.size (); int res = 0 ; for (int i = 0 ; i < (1 << m); i++){ int x = GetCnt (i); if (x <= res)continue ; if (check (i))res = x; } return res; } };