leetcode每天5题-Day43(二叉树8)

发布时间:2022-12-03 LEETCODE 数据结构 算法 LEETCODE刷题笔记

1. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先-中等
讲解

思路:遍历顺序很重要,因为要把左子树和右子树的结果返回给根节点,所以要自底向上遍历,只能采用后序遍历(即回溯)。

var lowestCommonAncestor = function(root, p, q) {
    // 1. 确定递归的函数
    const travelTree = function(root,p,q) {
        // 2. 确定递归终止条件
        if(root === null || root === p||root === q) {
            return root;
        }
        // 3. 确定递归单层逻辑
        let left = travelTree(root.left,p,q);
        let right = travelTree(root.right,p,q);
        if(left !== null&&right !== null) {
            return root;
        }
        if(left ===null) {
            return right;
        }
        return left;
    }
   return  travelTree(root,p,q);
};
2. 二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先-中等
视频讲解

思路:利用二叉搜索树的性质,当当前节点小于p和q的值时,就递归去遍历右子树;当当前节点大于p和q的值时,就递归去遍历左子树;遇到的第一个值介于p和q之间的节点,就是最近公共祖先。

递归

var lowestCommonAncestor = function(root, p, q) {
    // 1. 使用给定的递归函数lowestCommonAncestor
    // 2. 确定递归终止条件
    if(root === null) return root;
    if(root.val > p.val && root.val > q.val) {
        // 向左子树查询
         return lowestCommonAncestor(root.left, p, q);
    }
    if(root.val < p.val && root.val < q.val) {
        // 向右子树查询
        return lowestCommonAncestor(root.right, p, q);
    }
    return root;
};

迭代

var lowestCommonAncestor = function(root, p, q) {
    while(root) {
        if(root.val > p.val && root.val>q.val) {
            root = root.left;
        }else if(root.val < p.val && root.val < q.val) {
            root = root.right;
        }else {
            return root;
        }
        
    }
    return null;
};

很妙的一种解法

思路:利用root和p与root和q的差值来判断p与q是否在同一侧

var lowestCommonAncestor = function(root, p, q) {
    // q p 在同一侧
    while((root.val-p.val) * (root.val-q.val)>0){
        root = p.val > root.val ? root.right : root.left;
    }
    return root;
};
3. 二叉搜索树中的插入操作

701. 二叉搜索树中的插入操作-中等
讲解

思路:最直观也最简单的做法是不改变二叉搜索树原本的结构,把新节点插入到叶子节点位置。

自己的解法

思路:递归。刚开始是在原函数,也就是给定函数的基础上递归的,在递归函数内部用了if(!root) return null;,当第一次提交时,判空的时候出现了问题,也就是当给定一个空树时,函数就直接返回null了。所以我后面先对给定的是否是一棵空树这种特殊情况做下判断,再进行递归。

看了代码随想录的视频讲解与代码,才知道我这种解法没有完成新加入节点和其父节点的赋值操作。

var insertIntoBST = function(root, val) {
    let newNode = new TreeNode(val);
    if(!root) return newNode;
    const insert = (root, val) => {
        if(!root) return null;
        if(root.val < val) {
            let l = insert(root.right, val);
            if(!l) root.right = newNode;
        } else if(root.val > val) {
            let r = insert(root.left, val);
            if(!r) root.left = newNode;
        }
        return root;
    }
    return insert(root, val);
};

总结:通过递归函数返回值完成新加入节点的父子关系赋值操作,下一层将加入节点返回,本层用root.left或者root.right将其接住。

有返回值的递归

var insertIntoBST = function(root, val) {
        if (root === null) {
            let node = new TreeNode(val);
            return node;
        }
        if (root.val > val)
            root.left = insertIntoBST(root.left, val);
        else if (root.val < val)
            root.right = insertIntoBST(root.right, val);
        return root;
};

无返回值的递归

这种解法看着有点绕,我本来以为是改变了二叉树的结构,但其实并没有。新建一个节点parent,解决不知新节点应该是左叶子节点还是右叶子节点的问题

var insertIntoBST = function (root, val) {
    let parent = new TreeNode(0);
    const preOrder = (cur, val) => {
        if (cur === null) {
            let node = new TreeNode(val);
            if (parent.val > val)
                parent.left = node;
            else
                parent.right = node;
            return;
        }
        parent = cur;
        if (cur.val > val)
            preOrder(cur.left, val);
        if (cur.val < val)
            preOrder(cur.right, val);
    }
    if (root === null)
        root = new TreeNode(val);
    preOrder(root, val);
    return root;
};

迭代

var insertIntoBST = function (root, val) {
    if (root === null) {
        root = new TreeNode(val);
    } else {
        let parent = new TreeNode(0);
        let cur = root;
        while (cur) {
            parent = cur;
            if (cur.val > val)
                cur = cur.left;
            else
                cur = cur.right;
        }
        let node = new TreeNode(val);
        if (parent.val > val)
            parent.left = node;
        else
            parent.right = node;
    }
    return root;
};
4. ⭐删除二叉搜索树中的节点

450. 删除二叉搜索树中的节点-中等
讲解

这道题相比于上一题插入节点要难得多,因为插入节点不用改变二叉搜索树的结构,但本题有可能要重构二叉搜索树。

删除二叉搜索树中的节点有以下几种情况:

  1. 未找到需要删除的节点;
  2. 需要删除的节点是叶子节点(左子树和右子树都为空)
  3. 需要删除的节点左子树为空,右子树不为空
  4. 需要删除的节点左子树不为空,右子树为空
  5. 需要删除的节点左子树和右子树都不为空

解题重点:

  1. 删除节点的逻辑在终止条件里面
  2. 调整二叉树结构时的思路及其调整节点的指针指向
  3. 删除节点是通过递归返回值来操作的

递归

var deleteNode = function(root, key) {
    if(!root) return root;
    if(root.val > key) 
        root.left = deleteNode(root.left, key);
    else if(root.val < key) 
        root.right = deleteNode(root.right, key);
    else {
        if(!root.left && !root.right) {
            return null;
        }else if(root.left && !root.right) {
            return root.left;
        }else if(!root.left && root.right) {
            return root.right;
        }else{
            // 当被删除节点左右子树都非空时,利用新建节点cur 找到被删节点右子树的最左侧节点(cur.left),然后把被删节点的左子树放在该节点(cur.left)左子树的位置
            let cur = root.right;
            while(cur.left) cur = cur.left;
            cur.left = root.left;
            return root.right;
        }
    }
    return root;
};

迭代

var deleteNode = function (root, key) {
    const deleteOneNode = target => {
        if (!target) return target
        if (!target.right) return target.left
        let cur = target.right
        while (cur.left) {
            cur = cur.left
        }
        cur.left = target.left
        return target.right
    }

    if (!root) return root
    let cur = root
    let pre = null
    while (cur) {
        if (cur.val === key) break
        pre = cur
        cur.val > key ? cur = cur.left : cur = cur.right
    }
    if (!pre) {
        return deleteOneNode(cur)
    }
    if (pre.left && pre.left.val === key) {
        pre.left = deleteOneNode(cur)
    }
    if (pre.right && pre.right.val === key) {
        pre.right = deleteOneNode(cur)
    }
    return root
}

思考题:普通二叉树删除节点的方式

5. 修剪二叉搜索树

669. 修剪二叉搜索树-中等
讲解

递归

var trimBST = function(root, low, high) {
    if(!root) return root;
    
    if(root.val < low) return trimBST(root.right, low, high);
    if(root.val > high) return trimBST(root.left, low, high);
    
    root.left = trimBST(root.left, low, high);
    root.right = trimBST(root.right, low, high);
    return root;
};
6. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树-简单
讲解

重点:找分割点,分割点是数组中间的元素。

递归

var sortedArrayToBST = function(nums) {
    let len = nums.length;
    if(len < 1) return null;
    // let l = 0; r = len - 1;
    let mid = Math.floor(len / 2);
    let root = new TreeNode(nums[mid]);
    root.left = sortedArrayToBST(nums.slice(0, mid));
    root.right = sortedArrayToBST(nums.slice(mid + 1));
    return root;
};
7. 把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树-中等
讲解

更多相关推荐


AcWing 4622-整数拆分

发布时间:2022-10-04 C++ 算法 题解 补题
链接:4622.整数拆分-AcWing题库我们规定f(x)(x≥2)表示整数x的除本身之外的最大因数。例如,f(6)=3,f(25)=5,f(2)=1。现在,给定一个整数n,请你将其拆分为k份n1,n2,…,nk(也可以不拆分,即k=1),要求:n1+n2+…+nk=n对于1≤i≤k,ni≥2始终成立。f(n1)+f(n2)+…+f(nk)的值应尽可能小。输出f(n1)+f(n2)+…+f(nk)...

整数的拆分(哥德巴赫猜想)

发布时间:2022-10-02 C++ 算法
首先上题:我们规定f(x)(x≥2)表示整数x的除本身之外的最大因数。例如,f(6)=3,f(25)=5,f(2)=1。现在,给定一个整数n,请你将其拆分为k份n1,n2,…,nk(也可以不拆分,即k=1),要求:n1+n2+…+nk=n对于1≤i≤k,ni≥2始终成立。f(n1)+f(n2)+…+f(nk)的值应尽可能小。输出f(n1)+f(n2)+…+f(nk)的最小可能值。输入格式一个整数n...

小米面试——计算机视觉算法实习生

1.自我介绍2.(项目3)机器学习数据探索以及特征工程3.(项目2)论文复现以及实验结果4.(项目1)RGB-D图像分割相关5.求取单链表的中间值(①遍历求表长,取n/2②快慢指针)6.买卖股票的合适时间-入门I级(记录最小值和最大值,卤煮舍友昨日头条原题,真香!)贴上此题各种升级打怪版本:https://blog.csdn.net/qq_24153697/article/details/7884...

一本通 1261:【例9.5】城市交通路网(详细思路+详细代码)

发布时间:2022-11-20 C++ 算法 动态规划
目录选做法状态设置和转移求最短路径输出路径输入输出具体代码(最后代码) 题目看完,发现竟是一个关于有向无环图的题!  把输入样例看完,又发现题目用邻接表存储!选做法这题可以用DFS逐一试探,记录最小值这里我们就不写这种方法了,应该会超时为啥会超时呢?我们来写一下DFS访问的路径:125810125910......135810135910......145810145910......我们发现调用...

一本通 1262:【例9.6】挖地雷

发布时间:2022-11-23 C++ 算法 动态规划
 这题我们用动态规划做//【例9.6】挖地雷#include&lt;iostream&gt;usingnamespacestd;constintN=210;intn,dp[N],a[N],pre[N];boolto[N][N],isfirst=true;voidprint(intx){ if(x==-1) return; print(pre[x]); if(isfirst){ isfirst=...

一本通 1288:三角形最佳路径问题

发布时间:2022-11-15 C++ 算法 动态规划
 这题给你2种递推(不就是弱鸡的动态规划吗)写法目录        自顶向下写法        自底向上写法自顶向下写法代码://1288(自顶向下)#include&lt;iostream&gt;usingnamespacestd;constintN=105;intn,a[N][N],dp[N][N];intmain(){ cin&gt;&gt;n; for(inti=1;i&lt;=n;i++...

时间复杂度

发布时间:2022-12-02 C++ 算法
 我们来看一看 下图👇x轴代表数据量,也就是ny轴代表执行次数O(n!):n=10就超时了,所以很少看到这样时间复杂度的程序O(2^n):n=25也超时了,没有剪枝和记忆化的DFS就是O(2^n)的O(n^2):n=10000超时,大多代码都是这个时间复杂度,动态规划LIS和一些暴力枚举都是O(nlogn):n=1000000才超时,快速排序,归并排序,二分判定都是这个时间复杂度,算比较优秀的时间...

LeetCode---Maximum Depth of Binary Tree

发布时间:2015-09-21 LEETCODE 二叉树 递归 二叉树
题目大意:给出一个二叉树,求出该二叉树的最大深度。最大深度是指从根节点沿着最长路径到叶子节点的节点数。算法思想:采用递归遍历二叉树的方法,求出其左右子树的最大深度+1.代码如下:/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode(intx):val(x),...

点云进阶文章目录汇总

发布时间:2022-12-03 算法 几何 配准 点云进阶 聚类
一、点云聚类PCL点云DBSCAN聚类算法CloudCompare&amp;PCL快速欧式聚类(FEC)-----论文复现MATLAB快速欧式聚类(FEC)-----论文复现Open3D快速欧式聚类(FEC)PCL快速欧式聚类(FEC)PCLKMeans(K均值)聚类二、点云配准PCL基于ISS与FPFH提取特征点PCL基于优化的特征点进行点云转换PCL基于两点进行点云对齐PCL基于全局最大一致点...

浙大版《C语言程序设计(第3版)》练习2-18 求组合数

发布时间:2022-10-31 C++ 算法 C语言
本题要求编写程序,根据公式Cnm​=m!(n−m)!n!​算出从n个不同元素中取出m个元素(m≤n)的组合数。建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。输入格式:输入在一行中给出两个正整数m和n(m≤n),以空格分隔。输出格式:按照格式“result=组合数计算结果”输出。题目保证结果在double类型范围内。输入样例:27输出样例:result=21...

介绍五种可用于RGBD的SLAM建图算法:

发布时间:2022-10-25 算法 自动驾驶 SLAM
本文介绍五种可用于RGBD的建图算法:BundlefusionInfiniTAMRGBDSLAM2RTAB-MapORB-SLAM3BundleFusion优点:1.重建效果在所有RGB-DSLAM中靠前.2.使用持续的localtoglobal分层优化,去除了时域跟踪的依赖。3.不需要任何显示的loopclosure检测。因为每一帧都和历史帧相关,所以其实包含了持续的隐式的loopclosure...

《数据结构》 3.3.2 中序非递归遍历

发布时间:2022-01-14 数据结构 日志
 堆栈S中的元素是结构指针,T=Pop(s)这一步是把指针赋给T 图中圆圈1时是第一次遇到某元素,圆圈2时是第二次遇到某元素,把printf语句移到所示位置就是先序非递归遍历语句已验证过的后序非递归遍历: ...

数据结构二叉树中序遍历递归和非递归算法

发布时间:2022-11-19 数据结构 算法 C++ EDUCODER 树和二叉树
2022.11.19任务描述本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的中序遍历结果。相关知识向前翻,相关知识相同这里是传送门哦编程要求本关的编程任务是补全右侧代码片段InOrder和InOrder_iter中Begin至End中间的代码,具体要求如下:在InOrder中使用递归算法实现二叉树中序遍历递归算法并输出结果,中间没有空格,末尾不换行。在InOrder_iter中实现二叉...

经典算法大总结之排序算法

发布时间:2012-08-15 数据结构 算法 MERGE RANDOM N2 优化
从本章开始,我们将总结常用的排序算法这里有一个很好的博文http://blog.csdn.net/morewindows/article/details/6709644一,插入排序,O(n2)#include&lt;iostream&gt;usingnamespacestd;voidinsertionSort(int*A,intlen){ for(intj=1;j&lt;len;j++){ in...

算法之美(篇一)

发布时间:2022-10-18 算法 算法之美
14天阅读挑战赛目录数据结构+算法=程序算法概念特性“好”算法的标准时间复杂度(算法运行需要的时间) 空间复杂度(算法占用的空间大小)常见的算法时间复杂度算法题(神奇的兔子数列)思想算法数据结构+算法=程序数据结构是程序的骨架,算法是程序的灵魂。算法概念算法是对特定问题求解步骤的一种描述。特性有穷性:算法是由若干条指令组成的有穷序列,总是在执行若干次后结束,不可能永不停止;确定性:每条语句都有确定...

算法之美(篇二)

发布时间:2022-10-19 算法 算法之美
​​​​​​​14天阅读挑战赛​​​​​​​​​​​​​​目录学习算法的线索约瑟夫生者死者小游戏问题描述代码简要书评学习算法的线索算法作为一门学问,有两条几乎平行的线索。一条是数据结构(数据对象):数、矩阵、集合、串、排列、图、表达式、分布等。另一条是算法策略:贪心策略、分治策略、动态规划策略、线性规划策略、搜索策略等。这两条线索是相互独立的:对于同一个数据对象上不同的问题(如单源最短路径和多源最...

【算法基础复习1】差分

发布时间:2022-11-23 差分 算法 算法基础复习
 目录一、差分简介一维差分结论Acwing.797差分P4552[Poetize6]IncDecSequence-差分思维玄学题一、差分简介规定a数组下标从1开始 a[0]=0b数组下标从1开始定义一个数组b,使 对于a数组        其差分数组b为    a是b的前缀和数组  比如 a[2]=b[1]+b[2]=4+4=8比如 a[4]=b[1]+b[2]+b[3]+b[4]=4+4-2-1...

[leetcode刷题系列]Climbing Stairs

发布时间:2013-08-12 LEETCODE
--这其实是斐波拉契数列classSolution{intfib[100];public:intclimbStairs(intn){//StarttypingyourC/C++solutionbelow//DONOTwriteintmain()functionfib[0]=fib[1]=1;for(inti=2;i&lt;=n;++i)fib[i]=fib[i-1]+fib[i-2];return...

Climbing Stairs

发布时间:2014-10-29 LEETCODE
Youareclimbingastaircase.Ittakes n stepstoreachtothetop.Eachtimeyoucaneitherclimb1or2steps.Inhowmanydistinctwayscanyouclimbtothetop?简单递推classSolution{public:intclimbStairs(intn){longlongans=0;if(n==1)...

论人类下一代语言的可能—7.3.2符号的揭示方法

发布时间:2022-11-10 人类新语言的可能 JAVA 算法 服务器
概念化的认知中,符号的使用主要是刻画概念间的关系。从现状来说,这种刻画是由逻辑、数学的应用带来的。从历史的角度,逻辑与数学则是在智力与符号使用共同演化的过程中发展起来的。符号对概念间关系的刻画,相互关联的符号本身可以形成一种场景,进一步的思考可以基于这种符号场景进行。也就是在符号反射效用中,符号可以唤起意义回到印象层的思考;反射也可以只到符号关系的形式,形式也是一种实质,思考可以基于形式展开;更多...

leetcode回溯法总结

发布时间:2022-11-19 LEETCODE 算法 职场和发展
回溯法代码随想录回溯是递归的副产品回溯算法可以抽象为树形结构,回溯法解决都是在集合中递归查找子集,集合的大小构成树的宽度,递归的深度构成树的深度。回溯三部曲回溯函数返回值及参数回溯函数终止条件回溯搜索的遍历过程回溯算法能解决的问题组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多...

Java_SequentialStack 顺序栈分享

发布时间:2022-11-14 数据结构 算法 学习 开发语言 JAVA
Java_SequentialStack顺序栈分享具体内容的解释都在注释上了StackInterface接口类publicinterfaceStackInterface&lt;T&gt;{//在接口处声明方法,在类内进行实现publicvoidpush(intelement);//用于表达进栈的方法publicintpop();//用于表达出栈的方法publicbooleanisEmpty();/...

螺旋方阵.

发布时间:2022-11-21 算法 开发语言 C语言
题目描述本题要求从右下角开始按螺旋型递减打印数字方阵。输入格式输入为一个正整数n(1=&lt;n&lt;=20)。输出格式螺旋型递减顺序输出n行n列的数字方阵,每个数字占4个宽度,左对齐。输入样例在这里给出一组输入。例如:4输出样例在这里给出相应的输出。例如:10987112161234513141516#include&lt;stdio.h&gt;intmain(){intn,N,k,m,i,j...

8.9 leetcode

发布时间:2021-08-10 LEETCODE
148.排序链表此题为三个知识点的合并:快慢指针找到链表中间节点(876.链表的中间结点)合并两个有序链表(21.合并两个有序链表)右递归和非递归两种写法归并排序1、快慢指针的关键点:参考题解讨论以下两种while条件的区别结点个数为奇数,slow都是指向中间结点,为偶数,slow有差异whilefastandfast.next: slow最后停在中间两个的右边那个whilefast.nextan...

C++String类常用函数总结

发布时间:2022-11-22 C++ 算法 开发语言 C&C++
string容器string是C++中用于管理字符的一个类本质上字符在string类中是char*类型的变量,只不过被封装成了一个类,这个类中重载了很多运算符,使其像个数组一样。下面总结了一些string类的函数和重载的运算符string的构造函数string()默认构造string(constchar*s)字符串构造string(conststring&amp;s)拷贝构造string(intn...

C++Vector和deque容器

发布时间:2022-11-23 C++ 算法 开发语言 C&C++
vectorvector是STL中最常用的一种数据结构特点:与数组类似,但是数组是固定长度,vector是长度可变的,可以动态扩展的。支持随机访问动态扩展并不是在原有的空间进行扩展,而是新建一个比原来更大的空间,空间的大小由vector内部的算法确定vector的构造函数vector&lt;T&gt;v;用类模板实现,默认构造函数vector(v.begin(),v.end());将一个v[v.b...

超简单最短距离之深度优先搜索

发布时间:2018-05-28 算法 C++ 最短距离 深度优先搜索
//最短路径//例://有向图,以下分别表示P1点到P2点的距离//P1|P2|DIS//122//1510//233//257//314//344//455//533//step1:将存储图的方法称为图的*邻接矩阵存储法*//通路为距离大小,不通为-1,自身为0//12345//102-1-110//2-103-1-1//34-104-1//4-11-105//5-1-131-10//step2...

数据结构与算法的Java描述--1

发布时间:2016-08-06 JAVA 数据结构 数据结构与算法
1,递归调用的使用/*递归调用四条基本法则: *1,基准情形:必须有某些基准情形,他们不用递归就能求解 *2,不断推进:对于那些需要递归求解的情形,递归调用总能够朝着基准的情形的方向走过去 *3,设计法则:假设所有的地柜都能调用 *4,和成效益法则:再求解一个问题的同一实例时,切勿在不同的递归中做重复的运算 **/packageDemo1;publicclassDiGui{ voidprintOu...

奶爸生活-自行车

发布时间:2021-10-06 线性代数 算法 奶爸生活
今天有点事情,不能出去,孩子想去玩划船,需要我陪同,划船的时候,一个大人陪小孩玩,一个大人专心划船。然后跟孩子说了下,今天爸爸有重要事情,还没有解决,需要处理一下,让孩子理解下,爸爸不能出去玩了,刚开始孩子不同意,还在粘我,让我出去。后来发现没有用,爸爸真的有事情,她就表示理解了,自己主从说,不去划船了,去骑自行车,妈妈一个人就可以带着她骑自行车了,然后妈妈踩车轮,她掌控方向盘,分工合作,一起玩。...

02:输出绝对值

发布时间:2022-11-04 C++ 算法
总时间限制: 1000ms内存限制: 65536kB描述输入一个浮点数,输出这个浮点数的绝对值。输入输入一个浮点数,其绝对值不超过10000。输出输出这个浮点数的绝对值,保留到小数点后两位。样例输入-3.14样例输出3.14程序:状态: Accepted源代码#include&lt;iostream&gt;usingnamespacestd;intmain(){floata;cin&gt;&gt;...

数据结构之顺序存储结构的抽象实现

发布时间:2022-11-16 数据结构
配套环境clion+g++设计要求SeqList设计要点1.抽象类模板,存储空间的位置和大小由子类完成2.实现顺序存储结构线性表的关键操作(增,删,改,查等)3.提供数组操作符,方便快速获取元素实现代码#ifndefSEQLIST_H#defineSEQLIST_H#include"List.h"#include"Exception.h"namespaceDTLib{template&lt;typ...

数据结构-三元组实验的基本操作

发布时间:2022-11-08 数据结构 算法 C语言 C++ 开发语言
目录一、主要操作二、main(主函数调用操作函数部分)三、function(核心函数功能部分)四、com(函数、类型等的定义部分)一、主要操作 二、main(主函数调用操作函数部分)#define_CRT_SECURE_NO_WARNINGS#include&lt;iostream&gt;#include&lt;stdio.h&gt;#include"com.h"/*runthisprogramu...

44.类型转换

向上和向下类型转换参考:向上、向下转换 1.静态转换(static_cast)用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换进行上行转换(把派生类的指针或引用转换成基类表示)是安全的进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的用于基本数据类型之间的转换,如把int转换成char,把char转换成int。这种转换的安全性也要程序员自己保证...

人工智能之机器学习常见算法

发布时间:2019-06-17 算法 人工智能
                                       摘要之前一直对机器学习很感兴趣,一直没时间去研究,今天刚好是周末,有时间去各大技术论坛看看,刚好看到一篇关于机器学习不错的文章,在这里就分享给大家了.机器学习无疑是当前数据分析领域的一个热点内容。很多人在平时的工作中都或多或少会用到机器学习的算法。这里IT经理网为您总结一下常见的机器学习算法,以供您在工作和学习中参考机器...

基础知识系列博客——数据结构

发布时间:2019-06-17 数据结构
用严蔚敏和吴伟民老师编著的《数据结构(C语言版)》简单复习了一下数据结构知识。本书有相当多的算法,是一本比较全面的书籍。参考了罗文劼、王苗和张小莉老师的《数据结构与算法(Java版)》,也是一本非常优秀的教科书,总结的很到位。...

leetcode算法每天一题029:两数相除

发布时间:2022-11-23 LEETCODE 语言学习笔记 算法
题目描述给定两个整数,被除数dividend和除数divisor。将两数相除,要求不使用乘法、除法和mod运算符。返回被除数dividend除以除数divisor得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345)=8以及truncate(-2.7335)=-2解:classSolution{public:intdivide(intx,inty){b...

leetcode算法每天一题030:串联所有单词的子串

题目描述给定一个字符串s和一个字符串数组words。words中所有字符串长度相同。s中的串联子串是指一个包含words中所有字符串以任意顺序排列连接起来的子串。例如,如果words=["ab","cd","ef"],那么"abcdef","abefcd","cdabef","cdefab","efabcd",和"efcdab"都是串联子串。"acdbef"不是串联子串,因为他不是任何words排...

证明:在RB-DELETE中,如果y是红色的,则当y被删除后,红黑性质得以保持

发布时间:2011-05-17 算法
在RB-DELETE中,当y是黑色时,会调用RB-DELETE-FIXUP函数对红黑树的颜色进行调整,这意味着,如果y是红色的,就不需要进行调整,下面来证明这个命题的正确性。 首先,红黑树的性质1)和3)显然满足,对于性质2)、4)和5)分为3种情况来讨论。 对于情况1),删除的结点z的子结点只有黑色哨兵结点,这种情况下,y=z,删除y不会对红黑树的黑高度造成影响,y是红色,也不可能是根,也不可能...

LeetCode每天刷day40:Rotate Image

发布时间:2019-04-26 LEETCODE
题目:给定一个n×n的二维矩阵表示一个图像。将图像顺时针旋转90度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。题目链接:RotateImageC++:classSolution{public:voidrotate(vector&lt;vector&lt;int&gt;&gt;&amp;matrix){inttemp=0;introll=mat...

leetcode day25 寻找重复数

发布时间:2022-07-18 LEETCODE 算法 职场和发展
1.题目描述2.代码构思(debug)classSolution:deffindDuplicate(self,nums:List[int])-&gt;int:#二分法left=1right=len(nums)-1whileleft&lt;right:#print(left)mid=(left+right)//2count=0fornuminnums:ifnum&lt;=mid:count+=1if...