leetcode周赛266记录

本文讨论了如何使用二分法解决T3问题,即在限制每个商店分配数量的情况下,最大化分配给任意商店的产品总量。同时介绍了T4问题,通过深度优先搜索(DFS)求解图中最大路径质量,涉及地图遍历和节点访问策略的调整。
摘要由CSDN通过智能技术生成

T3-Minimized Maximum of Products Distributed to Any Store在这里插入图片描述

IDEA

  • 划分解空间(和前一个博客的题目类似)
  • 二分法求解
  • 令k:每个商店的分配数量小于等于k是否有可能。
    • 则k的下界:所有quantities加起来,对商店的均值
    • 则k的上界: quantities中的最大值。
    • 所以,对于[下界,上界]区间进行二分查找。注意二分查找的细节。
class Solution {

    //判断每个商店的数量<=k是否有可能
    public boolean judge(int k,int[] quantities,int n)
    {
        int ret = 0;
        for(int i = 0;i<quantities.length;i++)
        {
            ret += (int)Math.ceil((double)quantities[i] / k);
            if(ret > n)
                return false;
        }
        return true;
    }

    public int minimizedMaximum(int n, int[] quantities) {

        //在区间[floor(quantities / n),max(quantities)]进行二分
        int avg = 0;
        int max = Integer.MIN_VALUE;
        for(int i : quantities)
        {
            max = Math.max(max,i);  //求最大值
            avg+=i;
        }
        avg =(int)Math.floor((double)avg / n);
        //二分区间为[avg,max]
        int low  =  avg;
        int high = max;
        while(low <= high)
        {
            int mid = (low + high) / 2;
            if(!judge(mid, quantities, n))
            {
                low = mid + 1;
            }
            else high = mid - 1;
        }
        return low;
    }
}
  • 仔细斟酌,这里退出之后low是答案

T4:Maximum Path Quality of a Graph

在这里插入图片描述
在这里插入图片描述

  • 使用DFS
  • visit数组的用法需要更改
  • 当初次进入即visit对应值为0时加上该结点的价值
  • 退栈时visit对应的值减1
class Solution {
    long ret = 0;

    public void DFS(int i,int j,Map<Integer,List<int[]>> adjmap,int[] values,int[] visit,long cur_val)
    {
         if(j < 0)
             return;
         if(visit[i] == 0) {   //每个结点至多被访问一次
             cur_val += values[i];
         }
         visit[i] ++;   //标记当前结点正在被访问
         if(i == 0)
             ret = Math.max(ret,cur_val);
         for(int[] edges:adjmap.get(i))
         {

             DFS(edges[0],j - edges[1],adjmap,values,visit,cur_val);

         }
         visit[i]--;
    }
    
    public int maximalPathQuality(int[] values, int[][] edges, int maxTime)
    {
        Map<Integer,List<int[]>> adjmap = new HashMap<>();
        for(int i = 0;i<values.length;i++)
            adjmap.put(i,new ArrayList<>());
        for(int i = 0;i<edges.length;i++)
        {
            adjmap.get(edges[i][0]).add(new int[]{edges[i][1],edges[i][2]});
            adjmap.get(edges[i][1]).add(new int[]{edges[i][0],edges[i][2]});
        }
        int[] visit = new int[values.length];
        DFS(0,maxTime,adjmap,values,visit,0);
        return (int)ret;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值