日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java出代码1601_LeetCode 1601. 最多可达成的换楼请求数目

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java出代码1601_LeetCode 1601. 最多可达成的换楼请求数目 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

我們有?n?棟樓,編號從?0?到?n - 1?。每棟樓有若干員工。由于現在是換樓的季節,部分員工想要換一棟樓居住。

給你一個數組 requests?,其中?requests[i] = [fromi, toi]?,表示一個員工請求從編號為?fromi?的樓搬到編號為?toi?的樓。

一開始?所有樓都是滿的,所以從請求列表中選出的若干個請求是可行的需要滿足 每棟樓員工凈變化為 0?。意思是每棟樓 離開?的員工數目 等于?該樓 搬入?的員工數數目。比方說?n = 3?且兩個員工要離開樓?0?,一個員工要離開樓?1?,一個員工要離開樓 2?,如果該請求列表可行,應該要有兩個員工搬入樓?0?,一個員工搬入樓?1?,一個員工搬入樓?2?。

請你從原請求列表中選出若干個請求,使得它們是一個可行的請求列表,并返回所有可行列表中最大請求數目。

樣例

輸入:n = 5, requests = [[0,1],[1,0],[0,1],[1,2],[2,0],[3,4]]

輸出:5

解釋:請求列表如下:

從樓 0 離開的員工為 x 和 y ,且他們都想要搬到樓 1 。

從樓 1 離開的員工為 a 和 b ,且他們分別想要搬到樓 2 和 0 。

從樓 2 離開的員工為 z ,且他想要搬到樓 0 。

從樓 3 離開的員工為 c ,且他想要搬到樓 4 。

沒有員工從樓 4 離開。

我們可以讓 x 和 b 交換他們的樓,以滿足他們的請求。

我們可以讓 y,a 和 z 三人在三棟樓間交換位置,滿足他們的要求。

所以最多可以滿足 5 個請求。

輸入:n = 3, requests = [[0,0],[1,2],[2,1]]

輸出:3

解釋:請求列表如下:

從樓 0 離開的員工為 x ,且他想要回到原來的樓 0 。

從樓 1 離開的員工為 y ,且他想要搬到樓 2 。

從樓 2 離開的員工為 z ,且他想要搬到樓 1 。

我們可以滿足所有的請求。

輸入:n = 4, requests = [[0,3],[3,1],[1,2],[2,0]]

輸出:4

算法分析

模擬 + 位運算

1、題目說到:從請求列表中選出的若干個請求是可行的需要滿足 每棟樓員工凈變化為 0?,在滿足某些部分人請求的情況下,一定會使得每棟樓 離開?的員工數目 等于?該樓 搬入?的員工數數目

2、先看數據范圍,最多只有16個請求,其中每個請求有允許 和 不允許兩個狀態,因此總的情況最多是2^16種

3、枚舉所有請求允許和不允許的所有情況,當枚舉到第i種狀態時,第j位是1表示,表示第j個條件滿足。其中cnt表示i狀態有多少個1,并且記錄每棟樓進入in的所有人數,和出去out的所有人數,但每棟樓k都滿足in[k] == out[k]時,則表示當前狀態i滿足題意,用cnt更新ans

時間復雜度 $O(2^m * max(n, m))$

Java 代碼

class Solution {

public int maximumRequests(int n, int[][] requests) {

int m = requests.length;

int[] out = new int[n];//記錄每棟樓出去多少人

int[] in = new int[n];//記錄每棟樓進來多少人

int ans = 0;

for(int i = 0;i < 1 << m;i ++)

{

Arrays.fill(out, 0);

Arrays.fill(in, 0);

int cnt = 0;

for(int j = 0;j < m;j ++)

{

if((i >> j & 1) == 1)

{

cnt ++;

out[requests[j][0]] ++;

in[requests[j][1]] ++;

}

}

boolean flag = true;

for(int j = 0;j < n;j ++)

{

if(out[j] != 0 && out[j] != in[j])

{

flag = false;

break;

}

}

if(flag) ans = Math.max(ans, cnt);

}

return ans;

}

}

總結

以上是生活随笔為你收集整理的java出代码1601_LeetCode 1601. 最多可达成的换楼请求数目的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。