leetcode 2

在这里插入图片描述

public class MakeNo {
    public static int[] makeNo(int size){
        if(size == 1){
            return new int[] {1};
        }
        /**
         * size
         * 一半
         * [4个奇数,3个偶数]
         * 如果奇数满足,2*奇数-1也满足 偶数也是,交叉也是,数学证明
         */
        int halfSize = (size + 1)/2;
        int[] base = makeNo(halfSize);
        int[] ans = new int[size];
        int index = 0;
        for(;index < halfSize;index++){
            ans[index] = base[index]*2+1;
        }
        for (int i = 0; index < size; i++,index++) {
            ans[index] = base[i]*2;
        }
        return ans;
    }
}

在这里插入图片描述

public class MaxSumInTree {
    public static class Node{
        public int value;
        public Node left;
        public Node right;
        public Node(int val){
            value = val;
        }
    }

    //从头节点出发,返回最大路径和
    public static int maxSum = Integer.MIN_VALUE;

    public static int maxPath(Node head){
        p(head,0);
        return maxSum;
    }

    public static void p(Node x,int pre){
        if(x.left == null && x.right==null){
            maxSum= Math.min(maxSum,pre+x.value);
        }
        if(x.left != null){
            p(x.left,x.value+pre);
        }
        if(x.right != null){
            p(x.right,x.value+pre);
        }
    }

    //从x开始遍历
    public static int process2(Node x){
        if (x.left == null && x.right == null) {
            return x.value;
        }
        int next = Integer.MIN_VALUE;
        if(x.left!=null){
            next = process2(x.left);
        }
        if(x.right!=null){
            next = Math.max(next,process2(x.right));
        }
        return x.value + next;
    }

    //从任意节点出发,只能往下走 最大路径
    //这个和从头结点出发有什么区别呢,这个可以不经过头结点,就是答案可以不经过头结点
    //假设从X出发,分为和X有关的情况,分为和X无关的情况


    public static class Info{
        public int allTreeMaxSum;
        public int fromHeadMaxSum;

        public Info(int all,int from){
            allTreeMaxSum = all;//该树的最大值 不一定从头出发
            fromHeadMaxSum  = from;//从头出发的最大值
        }
    }

    /**
     * 和x无关 左树最大和,右树最大和
     * 和x相关 x自己,往x左走,往x右走
     * @param x
     * @return
     */
    public static Info process22(Node x){
           if(x == null){
               return null;
           }
           Info leftInfo = process22(x.left);
           Info rightInfo = process22(x.right);

           int p1 = Integer.MIN_VALUE;
           if(leftInfo != null){
               p1 = leftInfo.allTreeMaxSum;
           }

        int p2 = Integer.MIN_VALUE;
        if(rightInfo != null){
            p2 = rightInfo.allTreeMaxSum;
        }

        //p3 p4 p5以x为头结点的最长路径
        int p3 = x.value;

        int p4 = Integer.MIN_VALUE;
        if(leftInfo != null){
            p4 = x.value + leftInfo.fromHeadMaxSum;
        }


        int p5 = Integer.MIN_VALUE;
        if(rightInfo != null){
            p5 = x.value + rightInfo.fromHeadMaxSum;
        }

        int allTreeMaxSum = Math.max(Math.max(Math.max(p1,p2),p3),Math.max(p4,p5));
        int fromHeadMaxSum = Math.max(Math.max(p3,p4),p5);
        return new Info(allTreeMaxSum,fromHeadMaxSum);
    }

    public static int maxSum2(Node head){
        if(head == null){
            return 0;
        }
        return process22(head).allTreeMaxSum;
    }


    //可以往左走 也可以往右走,每个路径只能走一次,不一定到根节点
    /**
     * 和x无关 左树最大和,右树最大和
     * 和x相关 x自己,往x左走,往x右走 继往左又往右走
     * @param x
     * @return
     */
    public static Info process33(Node x){
        if(x == null){
            return null;
        }
        Info leftInfo = process33(x.left);
        Info rightInfo = process33(x.right);

        int p1 = Integer.MIN_VALUE;
        if(leftInfo != null){
            p1 = leftInfo.allTreeMaxSum;
        }

        int p2 = Integer.MIN_VALUE;
        if(rightInfo != null){
            p2 = rightInfo.allTreeMaxSum;
        }

        //p3 p4 p5以x为头结点的最长路径
        int p3 = x.value;

        int p4 = Integer.MIN_VALUE;
        if(leftInfo != null){
            p4 = x.value + leftInfo.fromHeadMaxSum;
        }


        int p5 = Integer.MIN_VALUE;
        if(rightInfo != null){
            p5 = x.value + rightInfo.fromHeadMaxSum;
        }

        //既往左走 右边走
        int p6 = Integer.MIN_VALUE;
        if(leftInfo != null && rightInfo != null){
            p6 = x.value + leftInfo.fromHeadMaxSum + rightInfo.fromHeadMaxSum;
        }
        int allTreeMaxSum = Math.max(Math.max(Math.max(p1,p2),p3),Math.max(p4,Math.max(p5,p6)));
        int fromHeadMaxSum = Math.max(Math.max(p3,p4),p5);
        return new Info(allTreeMaxSum,fromHeadMaxSum);
    }

    public static int maxSum3(Node head){
        if(head == null){
            return 0;
        }
        return process33(head).allTreeMaxSum;
    }

    public static int max = Integer.MIN_VALUE;

    //从任意节点出发,,只能往下走,到叶节点为止最大路径和 防止溢出 用long
    public static int bigShuai(Node head){
        if(head.left == null && head.right == null){
            max = Math.max(max,head.value);
            return head.value;
        }
        int nextMax = 0;
        if(head.left != null){
            nextMax = bigShuai(head.left);
        }
        if(head.right != null){
            nextMax = Math.max(nextMax,bigShuai(head.right));
        }
        int ans = head.value + nextMax;
        max = Math.max(max,ans);
        return ans;
    }

}

在这里插入图片描述

public class PackingMachine {
    public static int minOps(int[] arr){
        if(arr == null || arr.length == 0){
            return 0;
        }
        int size = arr.length;
        int sum = 0;
        for (int i = 0; i < size; i++) {
            sum+=arr[i];
        }
        if(sum % size != 0){
            return -1;
        }
        int avg = sum / size;
        int leftSum = 0;
        int ans = 0;
        for (int i = 0; i < arr.length; i++) {
            int leftRest = leftSum - i * avg;
            int rightRest = (sum-  leftRest - arr[i])-(size-i-1)*avg;
            if(leftRest < 0 && rightRest < 0 ){
                ans = Math.max(ans,Math.abs(leftRest)+Math.abs(rightRest));
            }else{
                ans = Math.max(ans,Math.max(Math.abs(leftRest),Math.abs(rightRest)));
            }
            leftRest+=arr[i];
        }
        return ans;
    }

}
![在这里插入图片描述](https://img-blog.csdnimg.cn/06b91e7b294c4bf6bace6375676c0f67.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzQyNjczNTgz,size_20,color_FFFFFF,t_70,g_se,x_16)
思路:首先找到最大值,假设最大值划分为左边,那么最右边的数一定是最大值的最小值,,同理 如果最大值划分为右边,也类似,所以最大值减去两边的值
根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值