一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
今日份题型,分别是递归与数组
相同的树
该题出自力扣的100题 —— 相同的树【简单题】
审题
给你两棵二叉树的根节点
p和q,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的
- 题意很短,但是思路很简单,就是给出两个二叉树,需要辨别出两个二叉树是否为相同的(节点与结构相等)
- 结构相等 —— 也就是左右子树不能出现分歧,需要一致
- 节点相等,顾名思义就是节点内的值val要相等
- 解法:递归
- 判断节点是否同时为空(判断结构是否一致)
- 判断节点的值value是否一致(判断节点是否相等)
- 递归左右子树
编码
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q== null)return true;
if (p ==null || q==null)return false;
if (p.val != q.val)return false;
return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
}
}
找到所有数组中消失的数字
该题出自力扣的448题 —— 找到所有数组中消失的数字【简单题】
审题
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
- 题意也相对简单,毕竟是道简单题。就是给出一个int的数组,数组的取值范围在1-数组的长度([1,nums.length]),需要找出1-n中,不存在数组内的数值,并填充到集合里面
- 正常流程的话,可以用双重for循环 + HashMap去实现,第一重循环塞进HashMap中,第二次循环利用HashMap的containKey方法找出不存在的值
- 上述的方法可以实现,但是时间复杂度为O(n^2),空间复杂度O(n)
- 还可以原地实现
- 利用当前数组的值,因为值为[1,n],所以利用值去找到值对于的下标(nums[i] = 2,index = 2-1),并且对值 + 长度n
- 因为在遍历处理的过程中,有可能对后续的值进行覆盖,所以需要进行取模
- 最后遍历出不超过长度的值,其下标索引值 加入列表返回即可
编码
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
int n = nums.length;
for (int i = 0; i < n; i++) {
int x = (nums[i] -1)%n;
nums[x] +=n;
}
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
if (nums[i] <= n){
list.add(i+1);
}
}
return list;
}
}