其他分享
首页 > 其他分享> > 12.13补课周

12.13补课周

作者:互联网

记录2

leetcode 104
递归
非递归的栈的还不会写
二叉树 an
思路
利用DFS,深度递归;总深度为左石子树最大深度加1;
空树深度为0。

代码

// An highlighted block
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null) {
            return 0;
        } else {
            int left = maxDepth(root.left);
            int right = maxDepth(root.right);
            return Math.max(left, right) + 1;
        }
    }
}

第二题
136
本以为这是一个简单题目,遍历一遍记录只出现一次的数就好了
但是利用异或运算降低时间复杂度的想法太惊艳我了……

哈希表还正在学习中…
只出现一次的数字

思路

  1. 使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。
  2. 使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。
    哈希表是最好想的…
  3. 使用集合存储数组中出现的所有数字,并计算数组中的元素之和。由于集合保证元素无重复,因此计算集合中的所有元素之和的两倍,即为每个元素出现两次的情况下的元素之和。由于数组中只有一个元素出现一次,其余元素都出现两次,因此用集合中的元素之和的两倍减去数组中的元素之和,剩下的数就是数组中只出现一次的数字。
    这个利用的是数字计算.
    但是这都需要o(N)的复杂度
    要想做到线性阶
    用异或运算 交换律相同的异或为0最后0和那个单独的数运算结果就是他自己,这时时间复杂度是O(1)。
    代码

哈希集思路 一个数对应一个Count

class Solution {
    public int singleNumber(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (Integer i : nums) {
            Integer count = map.get(i);
            count = count == null ? 1 : ++count;
            map.put(i, count);
        }
        for (Integer i : map.keySet()) {
            Integer count = map.get(i);
            if (count == 1) {
                return i;
            }
        }
        return -1; // can't find it.
    }
}

集合思路

public static int singleNumber_HashSet(int[] nums) {

    int len = nums.length;
    Set<Integer> set = new HashSet<>();

    for (int i = 0; i < len; i++) {
        // 尝试将当前元素加入 set
        if (!set.add(nums[i])) {
            // 当前元已经存在于 set,即当前元素第二次出现,从 set 删除
            set.remove(nums[i]);
        }
    }

    // 最后只剩一个不重复的元素
    return set.iterator().next();
}

异或
我是想不出来的呜呜

int ans = nums[0];
if (nums.length > 1) {
   for (int i = 1; i < nums.length; i++) {
      ans = ans ^ nums[i];
   }
 }
 return ans;

标签:count,set,数字,nums,int,元素,补课,12.13
来源: https://blog.csdn.net/weixin_46338641/article/details/111341298