[学习报告]《LeetCode零基础指南》(第9讲)简单递归
学习内容:https://blog.csdn.net/WhereIsHeroFrom/article/details/120875679
一、今日知识点总结
函数调用自己,要有跳出条件判断
什么是简单递归,可以干嘛?
新收小白的一道坎 - 递归
含义:函数内调用函数自身(函数自己调自己)
记住主要三点
- 实现一个函数,这个函数会调用自己。每次调用,函数传参不一样
- 递归要有出口,即满足一定条件后需要return,否则可能出现 死递归==引起栈溢出
- 根据递推式来补充你的递归调用内容
要注意递归出口的判断及递推关系
二、今日解题
172. 阶乘后的零
难度中等
//突破点:制造10的情况:
//5! = 5*4*3*2*1,有1个0,制造0的组合 5*2=10
//10!= 10*9*8*7*6*5*4*3*2*1 有2个0 ==> 5*2 , 10 = 5*2
// 由此看出,计算末尾有多少个0,其实是找出隐含多少个5*2,也就是找出多少个因子为5和因子为2的
// 且因子为2的必然比因子为5的多,则只要出现多少个为5的因子,即可组合出多少个10
//阶乘递推式
/*
unsigned long long jiecheng(n){
if(n<=1){
return 1;
}
return n*jiecheng(n-1);
}
*/
int trailingZeroes(int n){
int cnt = 0;
for(int i =1;i<=n;i++){
int k = i;
while(k>0){
if(k%5 == 0){//有一个因子=5
cnt++;
k /= 5 ;
}else{
break;
}
}
}
return cnt;
}
//以下解法:算出阶乘后,再模10判断多少个0,阶乘计算很快就溢出了
unsigned long long jiecheng(n){
if(n<=1){
return 1;
}
return n*jiecheng(n-1);
}
int trailingZeroes(int n){
unsigned long long r = jiecheng(n);
int cnt = 0;
while(1){
if(r%10 == 0){
cnt++;
r /=10;
}else{
break;
}
}
return cnt;
}
342. 将数字变成 0 的操作次数
因为是对一个数的反复操作,使用递归
//解法一
void step(int n,int *cnt){
if(n == 0){
return;
}
if(n&1){
//奇数
n--;
}else{
//偶数
n /= 2;
}
(*cnt)++;
step(n,cnt);
}
int numberOfSteps(int num){
int cnt = 0;
step(num,&cnt);
return cnt;
}
//解法二,递归中通过返回 1+递归函数的方式,合计操作次数
int numberOfSteps(int num){
if(num == 0){
return 0;
}
if(num&1){
num--;
}else{
num /= 2;
}
return 1+numberOfSteps(num);
}
222. 完全二叉树的节点个数
二叉树的每一个节点,有一个父节点和两个子节点。每个子节点也可能有两个子节点
父节点数量=1,左子节点若有,则为1+子节点数;右子节点若有,则有1+子节点数
cnt = 1 + 两个子节点的子节点 == 1 +f(left) + f(right)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int count(struct TreeNode *root){
if(root == NULL){
return 0;
}
return count(root->left) + count(root->right) + 1;
}
int countNodes(struct TreeNode* root){
return count(root);
}
LCP 44. 开幕式焰火
定义一个数组,记录出现过颜色种类,遍历二叉树,检查每个节点的值是否已经在该数组中,若不再则加入到该数组中。数组的长度就是颜色的种类
遍历二叉树,使用递归,递归函数中,若节点为空,则该节点不需要再递归下去。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
void count(struct TreeNode* root,int *colors,int *cnt){
if(root == NULL){
return;
}
bool b = false;
for(int i = 0;i<*cnt;i++){
if(root->val == colors[i]){
b = true;
break;
}
}
if(!b){
colors[*cnt] = root->val;
(*cnt)++;
}
count(root->left,colors,cnt);
count(root->right,colors,cnt);
}
int numColor(struct TreeNode* root){
int *colors = (int *)malloc( sizeof(int) * 10001);
int rSize = 0;
count(root,colors,&rSize);
return rSize;
}
三、今日收获
使用递归解决二叉树的遍历