每日N+1题 -- 算法练习 Day5

本文详细解析了LeetCode中的几道剑指Offer难题,包括剪绳子II、合并两个排序的链表以及树的子结构问题。通过作者Anjude的解法,展示了如何高效地解决这些问题。对于剪绳子II,重点在于找到最优的切割策略;合并两个排序的链表则利用遍历比较节点值进行合并;而对于树的子结构,采用深度优先搜索策略判断子树是否存在。

题目主要来源:LeetCode。主要选自剑指offer程序员面试宝典
每日尽可能保持 N+1 道题,N 取 0 到 9。

部分解法是从LeetCode上大佬们的解法中拿过来的,如有侵权,告知立删

0x01 剑指 Offer 14- II. 剪绳子 II

/**
 * JZ14  对结果取余,尽量分为等量的3
 *
 * @author Anjude
 * @date 2021/7/11 9:45
 */
public class JZ14 {
    public int cuttingRope(int n) {
        if (n <= 3) return n - 1;
        int b = n % 3, p = 1000000007;
        long res = 1;
        while (n > 4) {
            res *= 3;
            res = res % 1000000007;
            n -= 3;
        }
        return (int) (res * n % 1000000007);
    }
}

0x02 剑指 Offer 25. 合并两个排序的链表

/**
 * JZ25  遍历合并即可
 *
 * @author Anjude
 * @date 2021/7/11 17:34
 */
public class JZ25 {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null || l2 == null) return l1 == null ? l2 : l1;
        ListNode pre = new ListNode();
        ListNode curHead = pre;
        while (l1 != null && l2 != null) {
            if (l1.val > l2.val) {
                curHead.next = l2;
                l2 = l2.next;
            } else {
                curHead.next = l1;
                l1 = l1.next;
            }
            curHead = curHead.next;
        }
        curHead.next = l1 == null ? l2 : l1;
        return pre.next;
    }
}

0x03 剑指 Offer 26. 树的子结构

/**
 * JZ26  TODO
 *
 * @author Anjude
 * @date 2021/7/11 17:55
 */
public class JZ26 {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if (A == null || B == null) return false;
        return dfs(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
    }

    private boolean dfs(TreeNode a, TreeNode b) {
        if (b == null) return true;
        if (a == null) return false;
        return a.val == b.val && dfs(a.left, b.left) && dfs(a.right, b.right);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值