【算法】leetcode-1601 最多可达成的换楼请求数目

我们有 n 栋楼,编号从 0 到 n - 1 。每栋楼有若干员工。由于现在是换楼的季节,部分员工想要换一栋楼居住。

给你一个数组 requests ,其中 requests[i] = [fromi, toi] ,表示一个员工请求从编号为 fromi
的楼搬到编号为 toi 的楼。

一开始 所有楼都是满的,所以从请求列表中选出的若干个请求是可行的需要满足 每栋楼员工净变化为 0 。意思是每栋楼 离开 的员工数目 等于
该楼 搬入 的员工数数目。比方说 n = 3 且两个员工要离开楼 0 ,一个员工要离开楼 1 ,一个员工要离开楼 2
,如果该请求列表可行,应该要有两个员工搬入楼 0 ,一个员工搬入楼 1 ,一个员工搬入楼 2 。

请你从原请求列表中选出若干个请求,使得它们是一个可行的请求列表,并返回所有可行列表中最大请求数目。

class Solution {
    int ans = 0,len=0;
    int res = 0;
    public int maximumRequests(int n, int[][] requests) {
        //回溯法
        int[] delta = new int[n];
        len = requests.length;
        dfs(0,requests,delta,0);
        return res;

    }

    public void dfs(int index,int[][] requests,int[] delta,int cnt){
        if(cnt+len-index<res) return;
        if(index>=len){
            for(int i=0;i<delta.length;i++){
                if(delta[i]!=0){
                    return;
                }
            }
            res=Math.max(cnt,res);
            return;
        } 
        //取当前第index的请求
        delta[requests[index][0]]-=1;
        
        delta[requests[index][1]]+=1;

        dfs(index+1,requests,delta,cnt+1);
        //不取当前第index的请求
        delta[requests[index][0]]+=1;
        delta[requests[index][1]]-=1;
        dfs(index+1,requests,delta,cnt);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值