Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
刷题上瘾计划
导读
曾经实施过的计划(在我博客都能搜到):
自从开始记录自己的刷题笔记开始我从每日肥学系列,到动态规划二十一天,再到大厂特训二十八天,还有不攻下dfs不比赛系列。有兴趣大家可以去看看。从最后的结果来看我收到了一些志同道合的朋友一起刷题。如果你也想要加入我们可以直接私信我加入我们也可以下面留言打卡,现在我们的队伍还不是很大但是也有几位成功的同学了,有的进入了不错的公司(当然不能说全靠刷题得来的)有的拿到了比赛证书。接下来我会继续坚持下去,这个“瘾”我们要培养起来。所以我们再来一个为期二十八天刷题上瘾训练计划。等这二十八天过完我们在来一起总结一下。
PS:算法不太分语言大家都可以来的。
题目
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。
更正式地说,即 root.val = min(root.left.val, root.right.val) 总成立。
给出这样的一个二叉树,你需要输出所有节点中的 第二小的值 。
如果第二小的值不存在的话,输出 -1 。
示例 1:
输入:root = [2,2,5,null,null,5,7]
输出:5
解释:最小的值是 2 ,第二小的值是 5 。
示例 2:
输入:root = [2,2,2]
输出:-1
解释:最小的值是 2, 但是不存在第二小的值。
思路:
根据题目要求,如果第二小的值不存在的话,输出 -1−1,那么我们可以将 \textit{ans}ans 的初始值置为 -1−1。在遍历的过程中,如果当前节点的值严格大于 \textit{rootvalue}rootvalue 的节点时,那么只要 \textit{ans}ans 的值为 -1−1 或者当前节点的值严格小于 \textit{ans}ans,我们就需要对 \textit{ans}ans 进行更新。
此外,如果当前节点的值大于等于 \textit{ans}ans,那么根据「思路」部分,以当前节点为根的子树中所有节点的值都大于等于 \textit{ans}ans,我们就直接回溯,无需对该子树进行遍历。这样做可以省去不必要的遍历过程。
解一:深度搜索+双指针
/**
* 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 {
int secondMin, firstMin=secondMin=Integer.MAX_VALUE,flag=0;
public int findSecondMinimumValue(TreeNode root) {
if(root==null){
return secondMin;
}
if(root.val<firstMin){
firstMin=root.val;
}else if(root.val<=secondMin&&root.val!=firstMin){//找到第二小且预防第一第二相等
flag=1;//因为范围问题测试里面整好有一个root.val值作为第二小为Integer.MAX_VALUE
secondMin=root.val;
}
findSecondMinimumValue(root.left);
findSecondMinimumValue(root.right);
if(secondMin==Integer.MAX_VALUE&&flag==0)return -1;
return secondMin;
}
}
解二:
class Solution {
int ans;
int rootvalue;
public int findSecondMinimumValue(TreeNode root) {
ans = -1;
rootvalue = root.val;
dfs(root);
return ans;
}
public void dfs(TreeNode node) {
if (node == null) {
return;
}
if (ans != -1 && node.val >= ans) {
return;
}
if (node.val > rootvalue) {
ans = node.val;
}
dfs(node.left);
dfs(node.right);
}
}
重要的事情
如果你在学习python或者Java哪怕是C遇到问题都可以来给我留言,因为在学习初期新手总会走很多弯路,这个时候如果没有有个人来帮一把的话很容易就放弃了。身边很多这样的例子许多人学着学着就转了专业换了方向,不仅是自身问题还是没有正确的学习。所以作为一个过来人我希望有问题给我留言,说不上是帮助就是顺手敲几行字的事情。