12.13补课周
作者:互联网
记录2
leetcode 104
递归
非递归的栈的还不会写
思路
利用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
本以为这是一个简单题目,遍历一遍记录只出现一次的数就好了
但是利用异或运算降低时间复杂度的想法太惊艳我了……
哈希表还正在学习中…
思路
- 使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。
- 使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。
哈希表是最好想的… - 使用集合存储数组中出现的所有数字,并计算数组中的元素之和。由于集合保证元素无重复,因此计算集合中的所有元素之和的两倍,即为每个元素出现两次的情况下的元素之和。由于数组中只有一个元素出现一次,其余元素都出现两次,因此用集合中的元素之和的两倍减去数组中的元素之和,剩下的数就是数组中只出现一次的数字。
这个利用的是数字计算.
但是这都需要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