第七周题解

101. 对称二叉树

解法一(递归):

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

    public boolean isSymmetric(TreeNode root) {
        return judgeSymmetric(root, root); 
        //若写成return judgeSymmetric(root.left, root.right);
        //则当二叉树为空时会出现NullPointerException空指针异常
    }
    
    public boolean judgeSymmetric(TreeNode leftNode, TreeNode rightNode){
        if(leftNode == null && rightNode == null)
            return true;
        if(leftNode == null || rightNode == null)
            return false;
        if(leftNode.val == rightNode.val)
            return judgeSymmetric(leftNode.left, rightNode.right) && judgeSymmetric(leftNode.right, rightNode.left);
        return false;
    }
}

解法二:
将根节点的左右子树分别存入两个栈中,比较该节点是否相同,再将这两个节点的左右子树继续入栈,然后出栈比较,直到栈空。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        Stack<TreeNode> rootLeft = new Stack<TreeNode>();
        Stack<TreeNode> rootRight = new Stack<TreeNode>();

        if(root == null)
            return true;

        rootLeft.push(root.left);
        rootRight.push(root.right);
        
        while(!rootLeft.isEmpty() && !rootRight.isEmpty()) {
            TreeNode p = rootLeft.pop();
            TreeNode q = rootRight.pop();
            if(p == null && q == null)
                continue;
            if(p == null || q == null)
                return false;
            if(p.val == q.val){
                rootLeft.push(p.left);
                rootRight.push(q.right);
                rootLeft.push(p.right);
                rootRight.push(q.left);
            } else {
                return false;
            }
        }
        return true;
    }
}

1. 两数之和

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] index = new int[2];
        for(int i = 0; i < nums.length; i ++){
            for(int j = i + 1; j < nums.length; j ++){
                if(nums[i] + nums[j] == target){
                    index[0] = i;
                    index[1] = j;
                    return index;
                }
            }
        }
        return null;
    }
}

2. 两数相加

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode l3 = new ListNode(0); //初始化一个值为零的空节点
        ListNode node = l3; 
        int t = 0; //每位数相加后的值
        while(l1 != null || l2 != null || t != 0) {
            if(l1 != null) {
                t += l1.val;
                l1 = l1.next;
            }
            if(l2 != null){
                t += l2.val;
                l2 = l2.next;
            }
            node.next = new ListNode(t%10); //t%10,因为每位数的值不能超过10
            node = node.next;
            t /= 10; //该位数是否进位
        }
        return l3.next;
    }
}

3. 无重复字符的最长长度

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int[] last = new int[128]; //下标为字符在ASCII中的值
        for(int i = 0; i < 128; i++) {
            last[i] = -1;
        }

        int res = 0;
        int start = 0; // 无重复字符串开始位置
        for(int i = 0; i < s.length(); i++) {
            int index = s.charAt(i);
            start = Math.max(start, last[index] + 1);
            res = Math.max(res, i - start + 1); //当前无重复字符串的最长长度
            last[index] = i; //该字符上一次出现的位置
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值