CodeTop每日系列三题------------------2021.11.29

LC101. 对称二叉树
//递归迭代两种做法,直接从根节点的左右两个子树定义两个指针进行一个遍历,也就是递归函数上的参数进行一个更改。
迭代:层次遍历使用一个队列保存树的节点值,从队列中两两取出进行一个左右节点值的比较,当然插入队列的顺序也要是从外往里插。
在这里插入图片描述

//递归
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        return valid(root,root);
    }

    public boolean valid(TreeNode p,TreeNode q){
        if(p == null && q == null){
            return true;
        }
        if(p == null || q == null){
             return false;
        }
        return p.val == q.val && valid(p.left,q.right) && valid(p.right,q.left);
    }
}

//迭代
class Solution {
    public boolean isSymmetric(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList();
        if(root == null)
        return false;
        queue.offer(root.left);
        queue.offer(root.right);
        while(!queue.isEmpty()){
                TreeNode leftNode = queue.poll();
                TreeNode rightNode = queue.poll();
                if(leftNode == null && rightNode == null)
                continue;
                if(leftNode == null || rightNode == null || leftNode.val != rightNode.val)
                return false;
                queue.offer(leftNode.left);
                queue.offer(rightNode.right);
                queue.offer(leftNode.right);
                queue.offer(rightNode.left);
            }
        return true;
    }
}

在这里插入图片描述
LC322. 零钱兑换
在这里插入图片描述

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1];
        int max = amount + 1;
        // // 给dp赋初值,最多的硬币数就是全部使用面值1的硬币进行换
        Arrays.fill(dp,max);
        // 当背包容量为0的时候硬币无法进行填装所以dp[0] = 0
        dp[0] = 0;
        for(int i = 0;i < coins.length;i++){
            for(int j = 1;j <= amount;j++){
                //如果当前背包有位置的话,那么dp的值为要么取当前值要么就是背包容量减去当前硬币加1
                if(j - coins[i] >= 0){
                    dp[j] = Math.min(dp[j],dp[j - coins[i]] + 1);
                }
            }
        }
        return dp[amount] == max ? -1 :dp[amount];
    }
}

在这里插入图片描述
LC22. 括号生成
在这里插入图片描述

class Solution {
    
    private List<String> res = new LinkedList();
    private StringBuffer path = new StringBuffer();

    public List<String> generateParenthesis(int n) {
        if(n == 0)
        return res;
        backtrace(n,0,0);
        return res;
    }

    public void backtrace(int n,int left,int right){
        if(left == n && right == n){
            res.add(path.toString());
            return;
        }
        if(left < right){
            return;
        }
        if(left < n){
            path.append("(");
            backtrace(n,left + 1,right);
            path.deleteCharAt(path.length() - 1);
        }
        if(right < n){
            path.append(")");
            backtrace(n,left,right + 1);
            path.deleteCharAt(path.length() - 1);
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破晓以胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值