牛客网NC30-20.8.05-树,贪心

本文详细解析了NC30题目中关于树形结构的最大值寻找算法,并提供了具体的Java实现代码。通过分析树的深度和节点值的关系,提出了有效的算法策略,即在特定条件下选择左子树以达到最大值,其余情况下选择右子树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接NC30
题意、输入、输出
在这里插入图片描述
在这里插入图片描述
分析:对于题叙述的构造方法,一颗树,深度大的节点比深度小的值大,同一深度的右边大。所以为了得到最大值,可走最大深度的右边。左子树范围>=右子树范围。
思路:右边能一直平分的情况下要走左边,其他情况走右边,即是右边是2的n次方,这时右边是2的n次方加1,比右边多一层。
代码

import java.util.*;


public class Solution {
    /**
     * 
     * @param T int整型 
     * @param a int整型一维数组 
     * @return int整型一维数组
     */
    public int[] wwork (int T, int[] a) {
        // write code here
       int[] ans=new int[T];    
       for(int i=0;i<T;i++){
           int l=1;
           int r=a[i];
           int sum=1;
           while(l<r){
               int mid=(l+r)>>1;
               boolean fl=false;
               int left=mid-l+1;
               int right=r-mid;
               if(left>right){
                   int hh=right;
                   while(hh>0){
                       if((hh&1)==1)break;
                       if(hh==2){
                           fl=true;
                           break;
                       }
                       hh/=2;
                   }
               }
               if(fl||(left>right&&right==1)){
                   r=mid;
                   sum=sum*2;
               }
               else {
                   l=mid+1;
                   sum=sum*2+1;
               }
           }
           ans[i]=sum;
       }
       return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值