剑指Offer(面试题38~39)

剑指offer》Java版 一、引言 《剑指offer》可谓是程序猿面试的神书了,在面试中帮了我很多,大部分面试的算法题都会遇到原题或者是类似的题。但是书上的代码都是C版的,我在这里整理了一份Java版的代码供大家学习参考,这些代码我都是在OJ上跑过全AC的,所以正确性你大可放心。 二、目录 1赋值运算函数 2单例设计模式 3二维数组中查找目标值 4替换字符串中的空格 5从尾到头打印链表 6由前序和中序遍历重建二叉树 7用两... 阅读详情

面试题38:数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。

//递归的代码找到排列数组中的第一个k:
int GetFirstK(int* data,int length,int k,int start,int end)
{
    if(start > end)
        return -1;

    int middleIndex = (start + end) / 2;
    int middleData = data[middleIndex];

    if(middleData == k)
    {
        if((middleIndex > 0 && data[middleIndex - 1] != k)
           || middleIndex == 0)
            return middleIndex;
        else
            end = middleIndex - 1;
    }
    else if(middleData > k)
        end = middleIndex - 1;
    else
        start = middleIndex + 1;

    return GetFirstK(data,length,k,start,end);
}

int GetLastK(int* data,int length,int k,int start,int end)
{
    if(start > end)
        return -1;

    int middleIndex = (start + end) / 2;
    int middleData = data[middleIndex];

    if(middleData == k)
    {
        if((middleIndex < length - 1 && data[middleIndex +1 ] != k)
           || middleIndex == length - 1)
        {
            return middleIndex;
        }
        else
            start = middleIndex + 1;
    }
    else if(middleData < k)
        start =middleIndex + 1;
    else
        end = middleIndex - 1;

    return GetLastK(data,length,k,start,end);
}

//在分别找到第一个k和最后一个k的下标之后,我们就能计算出k在数组中出现的次数了。
int GetNumberOfK(int* data,int length, int k)
{
    int number = 0;

    if(data != NULL && length > 0)
    {
        int first = GetFirstK(data,length,k,0,length -1);
        int last = GetLastK(data,length,k,0,length - 1);

        if(first > -1 && last > -1)
            number = last - first +1;
    }

    return number;
}

在上述代码中,GetFirstK和GetLastK都是用二叉查找法在数组中查找一个合乎要求的数字,它们的时间复杂度都是O(logn),因此GetNumberOfK的总的时间复杂度也只有O(logn)。

面试题39:二叉树的深度

题目一:输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
二叉树的结点定义如下:

struct BinaryTreeNode
{
    int              m_nValue;
    BinaryTreeNode*  m_pLeft;
    BinaryTreeNode*  m_pRight;
};

用递归的方式实现代码如下:

int TreeDepth(BinaryTreeNode* pRoot)
{
    if(pRoot == NULL)
        return 0;

    int nLeft = TreeDepth(pRoot->m_pLeft);
    int nRight = TreeDepth(pRoot->m_pRight);

    return (nLeft > nRight) ? (nLeft + 1):(nRight + 1);
}

题目二:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

方法一:调用函数TreeDepth得到它的左右子树的深度。如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二叉树。代码如下:

bool IsBalanced(BinaryTreeNode* pRoot)
{
    if(pRoot == NULL)
        return true;

    int left = TreeDepth(pRoot->m_pLeft);
    int right = TreeDepth(pRoot->m_pRight);
    int diff = left - right;
    if(diff > 1 || diff < -1)
        return false;

    return IsBalanced(pRoot->m_pLeft) && IsBalanced(pRoot->m_pRight);
}

上面的代码固然简洁,但我们也要注意到由于一个结点会被重复遍历多次,这种思路的时间效率不高。

每个结点只遍历一次的解法,正是面试官喜欢的

bool IsBalanced(BinaryTreeNode* pRoot,int* pDepth)
{
    if(pRoot == NULL)
    {
        *pDepth = 0;
        return true;
    }

    int left,right;
    if(IsBalanced(pRoot->m_pLeft,&left)
       && IsBalanced(pRoot->m_pRight,&right))
    {
        int diff = left - right;
        if(diff <= 1 && diff >= -1)
        {
            *pDepth = 1 + (left > right ? left :right);
            return true;
        }
    }
    return false;
}
bool IsBalanced(BinaryTreeNode* pRoot)
{
    int depth = 0;
    return IsBalanced(pRoot,&depth);
}

在上面的代码中,我们用后序遍历的方式遍历整棵二叉树。在遍历某结点的左右子结点之后,我们可以根据它的左右子结点的深度判断它是不是平衡的,并得到当前结点的深度。当最后遍历到树的根结点的时候,也就判断整棵二叉树是不是平衡二叉树。

参考资料《剑指Offer》

Vben Admin权限管理全解析:从动态菜单到按钮级控制(附代码示例) 本文全面解析Vben Admin框架的权限管理系统,从动态菜单生成到按钮级细粒度控制,提供完整的实现方案和代码示例。深入探讨基于角色-权限模型的架构设计,分享前后端协作的最佳实践,帮助开发者快速构建安全高效的企业级后台系统。 阅读详情

相关推荐

基于LightGBM和多模型融合的量化交易研究:沪深300为例【附代码】

📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策✨ 专业领域:数据挖掘与清洗大数据处理与存储技术机器学习与深度学习模型数据可视化与报告生成分布式计算与云计算数据安全与隐私保护💡 擅长工具:Python/R/Matlab 数据分析与建模Hadoop/Spark 大数据处理平台SQL数据库管理与优化Tableau/Power BI 数据可视化工具TensorFlow/PyTorch 深度学习框架✅数据科学与大数据技术毕业论文【数据】

lagougongzuoshi的博客 1651

剑指 Offer 39. 数组中出现次数超过一半的数字

对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。若数组的前 a个数字的 票数和 =0,则 数组剩余 (n−a)个数字的票数和一定仍>0 ,即后 (n−a)个数字的 众数仍为 x。此方法时间和空间复杂度分别为 O(N)和 O(1) ,为本题的最佳解法。若记 众数 的票数为 +1 ,非众数 的票数为 −1 ,则一定有所有数字的 票数和 >0。时间复杂度:O(n),其中 nn 是数组。

庄小焱 517

TDOATaylorAlgorithm.rar_taylor定位_taylor算法_无源TDOA定位_时差定位_时差定位算法

TDOA无源时差定位Taylor算法,matlab源码

剑指 Offer(第2版)面试题 38:字符串的排列

剑指 Offer(第2版)面试题 38:字符串的排列

ProgramNovice的博客 538

剑指 Offer 38: 字符串的排列

这道题一看就是使用回溯法,但是由于是排列,所以索引和组合不同(组合的索引是从start标志位开始),排列是从下标为0开始,并且需要借助排序!所以需要先转化成将String转化为char[]类型,然后借用Arrays类的sort函数进行排序,排除可能重复的项目。而且String类型的数组每个元素等于一个对String列表使用get()函数,然后将对应元素存进String数组中。StringBuilder和StringBuffer的区别不仅只有速度和线程安全性的区别,还有调用函数的区别!

MengyuyangEddy的博客 200

剑指offer读书笔记3(面试题39-52)

0503 剑指offer读书笔记3面试题1-20面试题21-38第5章 优化时间和空间效率5.2 时间效率面试题39:数组中出现次数超过一半的数字 面试题1-20 见剑指offer读书笔记1 面试题21-38剑指offer读书笔记2 第5章 优化时间和空间效率 5.2 时间效率 面试题39:数组中出现次数超过一半的数字 ...............

weixin_38665351的博客 943

剑指 Offer》专项突破版 - 面试题 3839 和 40 : 通过三道面试题详解单调栈(C++ 实现)

面试题 38 : 每日温度 面试题 39 : 直方图最大矩形面积 面试题 40 : 矩阵中的最大矩形

melonyzzZ的博客 1328

大神整理的剑指Offer【所有面试题汇总】

    剑指Offer学习   剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代码下载【https://github.com/Wang-Jun-Chao/coding-interviews】 目录 第01-10题 【剑指Offer学习】【面试题02:...

晓飛的博客 3万+

剑指Offer学习】【所有面试题汇总】

剑指Offer学习  剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流!目录第01-10题【剑指Offer学习】【面试题02:实现Singleton 模式——七种实现方式】【剑指Offer学习】【面试题03:二维数组中的查找】【剑指Offer学习】【面试题04:替换空格】【剑指O

https://github.com/Wang-Jun-Chao 5万+

剑指Offer》解题目录(更新完毕)

题目来源于LeetCode上的《剑指Offer》,这里做一个目录方便大家查找。另外有本人的LeetCode解题目录、《程序员面试金典》可点击链接查看。

Michael是个半路程序员 6135

剑指Offer》-面试题Python实现合集

剑指Offer》作为互联网行业求职必看的书籍,其中收录了各大公司招聘时常问到的一些面试题,对于大家通过技术面颇有裨益。因此这个月我也花了接近三周早上的时间,用于通览全书。由于书中是用C++实现的,而本人主要使用Python,因此在掌握解题思路后,采用Python对每个面试题进行了重构。本着先过一遍再慢慢消化和吸收的原则,仓促完成了所有面试题的重构。如有问题,欢迎大家交流讨论~ 全部代码放在了Gi...

kabuto_hui的博客 2651

剑指offer--Java实现

剑指offer合辑之面试01-67 《剑指offer面试题 Java 代码的 Github 地址 《剑指offer面试题 Markdown 版本,包含题目、分析及代码的 Github 地址 面试题2 实现单例模式 面试题3 二维数组中的查找 面试题4 替换空格 面试题5 从尾到头打印链表 面试题6 重建二叉树 面试题7 用两个栈实现队列 面试题8 旋转数组的最小数字 面试题9 斐波那契数列...

LYZ 4100

剑指offer题型分类(持续更新~

剑指offer题型分类及各题的代码及解题思路(单击题目即可跳转) 题目分类参考:①和② 注:单击即可跳转到题目的详细代码(很多思路都来源于剑指offer第二版一书和牛客网剑指offer讨论区大佬们,非常感谢他们) 以下题目的序号和【剑指offer 第二版】一书对应 , 如有错误,欢迎指正 ^ - ^ 【祝愿大家早日拿到心仪的offer】 数组和字符串 数组 面试题3. 数组...

请叫我皮皮虾的博客 2569

剑指Offer(第一版)

除了剑指Offer第一版书中提到的思路,更有剑走偏锋的刁钻题解,欢迎一起变强 热点知识:快速幂(11)、回溯(12)、全排列(12)、斐波那契数列问题转化为求矩阵的n次方(9)、二叉树的遍历(18) 面试题1:赋值运算符函数 面试题2:实现Singleton模式 面试题3:二维数组中的查找 面试题4:替换空格 面试题5:从尾到头打印链表 面试题6:重建二义树 面试题7 :用两个栈实现队列 面试题8 :旋转数组的最小数字 面试题9 :斐波那契数列 面试题10 :二进制中1的个数 面试题11 :数值的整数次方.

qq_43808700的博客 3044

剑指Offer》Java版目录(源码下载)

剑指Offer》PDF版下载:点我书中全部50道题目的Java实现如下,java源码下载:点我剑指Offer面试题1面试题2单例模式 剑指Offer面试题3二维数组查找 剑指Offer面试题4替换空格 剑指Offer面试题5反向打印链表 剑指Offer面试题6重建二叉树(根据前序中序输出后序) 剑指Offer面试题7用两个栈实现队列(附带用两个队列实现栈) 剑指Offer面试题8旋转数

login_sonata的博客 4377

剑指offer》【剑指Offer 27.二叉树的镜像】

🏆个人主页:企鹅不叫的博客 ​ 🌈专栏 C语言初阶和进阶 C项目 Leetcode刷题 初阶数据结构与算法 C++初阶和进阶 《深入理解计算机操作系统》 《高质量C/C++编程》 ⭐️ 博主码云gitee链接:代码仓库地址 ⚡若有帮助可以【关注+点赞+收藏】,大家一起进步! 文章目录💎一、题目🏆1.题目描述🏆2.原题链接💎二、解题报告🏆1.思路分析🏆2.代码详解 💎一、题目 🏆1.题目描述 🏆2.原题链接 剑指Offer 27.二叉树的镜像 💎二、解题报告 🏆1.思路分析 🔑思路:.

YQ20210216的博客 213

剑指Offer系列之39:数组中出现次数超过一半的数(超简单思路分析)

剑指Offer系列之39:数组中出现次数超过一半的数(超简单思路分析) 一、题目详细描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 二、思路分析 1、首先题目假设数组非空,可以不考虑空数组情况,也可以在代码中加一句判别数组是否为空语句。 2、需要求的数字出现次数超过数组长度一半,说明它比其他所有数字的出现次数都多(至少多一次),因此可以考虑给

qq_43654303的博客 267

剑指offer 面试题38

面试题38:数字在排序数组中出现的次数 题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。 主要的思路是进行二分搜索找到第一个位置和最后一个位置,一开始的代码如下 1 #include <cstdio> 2 #include <cstdlib> 3 ...

aling1199的博客 219

剑指Offer(第二版)》面试题38. 字符串的排列

输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例: 输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"] 限制: 1 <= s 的长度 <= 8 class Solution: def permutation(self, s: str) -&gt...

今晚打老虎 385

剑指Offer面试题(第二十三天)面试题38

* 面试题38:字符串的排列 * 题目:输入一个字符串,打印该字符串中字符的所有排列。 * 例如:输入字符串abc,打印出字符a、b、c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba * * 思路:将字符串的多个位置拆分成 ==> 第一个字符+其他字符 * 第一步:第一个字符可以是字符串中的任意一个 ...

weixin_43137176的博客 263

剑指offer-面试题39:二叉树的深度

题目一:输入一颗二叉树的根结点,求该树的深度。从根结点到叶结点一次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 思路:如果根结点存在,那么深度至少为1,接下来求左右子树的深度,很明显用递归算法,最后树的深度就是左右子树中深度较大的加上1. int DepthOfBinaryTree(BinaryTreeNode* pRoot) { if(pRoot == NU

moses1213的专栏 692
上一篇: 剑指Offer(面试题35~37)
下一篇: 剑指Offer(面试题40~42)
Sandeldeng
博客等级 码龄11年 38粉丝 38原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值