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);
}
}
}