左神中期提升班2

目录

1.n个节点的二叉树种类

2.括号串匹配问题

3.数组中的 k-diff 数对(leetcode532)

4.增大两个集合的平均值 

1.n个节点的二叉树种类

思考:1个节点种类数为1,2个节点种类数为2,n个节点可以可以分成左边0个右边n-1个、左边1个右边n-2个.....左边n-1个右边0个,可以使用递归方法解决。

private static int process(int n) {
        if (n<2)
            return 1;
        if (n==2)
            return 2;
        int res=0;
        for (int i = 0; i < n; i++) {
            int leftNum = process(i);
            int rightNum = process(n-1-i);
            res += (leftNum*rightNum);
        }
        return res;
    }

转换为动态规划

 private static int process1(int n)
    {
        int[] dp = new int[n+1];
        dp[0]=1;
        for (int i = 1; i < n+1; i++) {
            for (int j = 0; j < i; j++) {
                dp[i]+=(dp[j]*dp[i-1-j]);
            }
        }
        return dp[n];
    }

2.括号串匹配问题

 思考:在遍历括号串时,定义count用于计算左括号数量,当遇到右括号时,抵消一个左括号count--;当某一时刻count<0或者最后count!=0,则括号串不匹配。若要使得括号匹配则需要在count==-1时添加左括号,若最后count!=0,则需要在右边边添加count数量的右括号。

public static void main(String[] args) {
        String s = "()()()))()()";
        int count = 0;
        int ans = 0;
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i)=='(')
                count++;
            else {
                if(count==0)
                {
                    ans++;
                }
                else{
                    count--;
                }
            }
        }
        ans+=count;
        System.out.println(ans);
    }

3.数组中的 k-diff 数对(leetcode532)

给你一个整数数组 nums 和一个整数 k,请你在数组中找出 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。

k-diff 数对定义为一个整数对 (nums[i], nums[j]) ,并满足下述全部条件:

0 <= i, j < nums.length
i != j
nums[i] - nums[j] == k
注意,|val| 表示 val 的绝对值。

public int findPairs(int[] nums, int k) {
         HashMap<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i]))
                 map.put(nums[i],map.get(nums[i])+1);
            else
                map.put(nums[i],1);
        }
        int count = 0;
        for(int i : map.keySet())
        {
            // k==0时要单独考虑
            if (k==0)
            {
                if (map.get(i)>1)
                    count++;
            }else {
                if (map.containsKey(i+k))
                    count++;
            }
        }
        return count;
    }

4.增大两个集合的平均值 

思考:若两个集合平均值相等,则两个集合平均值不可能都相加;不相等时,只有平均值大的集合向平均值小的集合输送且去除的数据必须大于minAvg小于maxAvg。 

 private static int maxOps(int[] arr1, int[] arr2) {
        double sum1=0;
        for (int i = 0; i < arr1.length; i++) {
            sum1+=(double) arr1[i];
        }
        double sum2=0;
        for (int i = 0; i < arr2.length; i++) {
            sum2+=(double) arr2[i];
        }
        if (avg(sum1,arr1.length)==avg(sum2,arr2.length)){
            return 0;
        }
        int[] maxArr = null;
        double maxSum = 0;
        int[] minArr = null;
        double minSum = 0;
        if (avg(sum1,arr1.length)<avg(sum2,arr2.length)){
            maxArr=arr2;
            maxSum=sum2;
            minArr=arr1;
            minSum=sum1;
        }else {
            maxArr=arr1;
            maxSum=sum1;
            minArr=arr2;
            minSum=sum2;
        }
        int ops=0;
        int moreSize = maxArr.length;
        int lessSize = minArr.length;
        Arrays.sort(maxArr);
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < lessSize; i++) {
            set.add(minArr[i]);
        }
        for (int i = 0; i < maxArr.length; i++) {
            int temp = maxArr[i];
            if (temp>=avg(maxSum,moreSize))
            {
                break;
            }
            if (temp>avg(minSum,lessSize)&&(!set.contains(temp))){
                System.out.println(temp);
                minSum+=temp;
                maxSum-=temp;
                moreSize--;
                lessSize++;
                ops++;
            }
        }
        return ops;
    }

    private static double avg(double sum1, int length) {
        return sum1/length;
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值