剑指offer编程题
部分剑指offer编程题的题解
Assassin_Fan
多多指教
展开
-
剑指Offer-面试题51.数组中的逆序对 基于归并排序
这里是题目描述:剑指Offer-面试题51.数组中的逆序对这道题的直观方法是将数组nums中的每个数和位于它后面的数字进行比较,若位于它后面的数字小于它,则逆序总数加1。这种方法的时间复杂度为O(n2),但我们根据题干可知,0 <= 数组长度 <= 50000,因此这种方法最多会带来超过10e10的运算,超出时间限制基于归并排序的方法统计逆序对我们使用一种在归并排序基础上的方法,...原创 2020-04-24 17:29:50 · 264 阅读 · 0 评论 -
剑指Offer-面试题56-II:数组中唯一只出现一次的数字 位运算
这里是题目描述:剑指Offer-面试题56-II:数组中唯一只出现一次的数字本题可以用哈希表统计数组中每个数字出现次数,时间复杂度O(n),空间复杂度O(n)。我们可以使用位运算的方法,将空间复杂度降至O(1)——统计数组中所有数字在二进制各个位上为1的次数总和:因为数组中出现次数不为1的数字都出现了3次,所以某一数字二进制上某一位为1的时候,这一位一定会出现3次为1。因此除去只出现一次的数字...原创 2020-04-14 19:45:42 · 186 阅读 · 0 评论 -
剑指Offer-面试题56-I:组中数字出现的次数 异或位运算
这里是题目描述:剑指Offer-面试题56-I:组中数字出现的次数对于这道题,我们很容易就能想到使用哈希表统计数组中每个不同数字出现次数的方法,但是它不满足题目要求的空间复杂度**O(1)**的限制。要满足常数空间开销,我们可以使用位运算中的 异或运算 。异或运算介绍在java中,异或位运算的操作符为^,如1与0异或运算,写作 1^0。异或运算则是对于两个操作数相互对应的每一位,如果两个操作...原创 2020-04-14 19:01:06 · 153 阅读 · 0 评论 -
剑指Offer-面试题59-II:队列的最大值 双端队列法
这里是题目描述:剑指Offer-面试题59-II:队列的最大值本题和与它同属于一个大题的剑指Offer-面试题59-I:滑动窗口的最大值都可以用双端队列来存储当前的最大值以及接下来可能成为最大值的元素,来优化时间开销借助双端队列的解法本题要求max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。而其中的主要难点就在于让任何状态下的max_value时间...原创 2020-04-14 17:40:53 · 195 阅读 · 0 评论 -
剑指Offer-面试题59-I:滑动窗口的最大值 双端队列法
这里是题目描述:剑指Offer-面试题59-I:滑动窗口的最大值这道题我们直观上可以使用蛮力法,对所有可能的滑动窗口,遍历它们并求最小值。假设数组长度为n,滑动窗口尺寸为k,那么蛮力法的时间复杂度将是O(nk)。对于长度很长,尺寸较大的滑动窗口来说,时间开销很大,不能满足要求。借助双端队列的解法我们观察滑动窗口的移动规律可以得知,滑动窗口每向右移动一步,原窗口最左边的数字出窗口,原窗口最右边...原创 2020-04-14 17:03:19 · 254 阅读 · 0 评论 -
剑指Offer-面试题49:丑数
这里是题目描述:剑指Offer-面试题49:丑数对于一个丑数,它能且只能被2、3、5整除,也就是说,丑数可以被除以2、3、5中的一个或几个数,最终得到0。对于本题,直观的方法是从i=1开始,判断每个数字能否被2、3、5整除最后得到1,如果可以,i就是丑数,找到的丑数个数+1,否则不是丑数,接着判断下一个数字i。这种方法固然没有错误,但是i不管是不是丑数,都需要经过计算判断,因此要寻找第n个丑数,...原创 2020-04-08 16:50:25 · 171 阅读 · 0 评论 -
剑指Offer-面试题46:把数字翻译成字符串
这是是题目描述:剑指Offer-面试题46:把数字翻译成字符串方法一:递归定义函数f(i)表示以从左向右第i位开始的不同翻译数目,有f(i)=f(i+1)+f(i+2)*g(i,i+1),表示分别以第i位的一位数字和第i:i+1的两位数字为前缀的翻译数目的和就是我们要求的和,g(i,i+1)表示第i:i+1的两位数字是否在10~25的范围内,若是,g(i,i+1)=1,否则g(i,i+1)=0...原创 2020-04-02 18:22:29 · 123 阅读 · 0 评论 -
剑指Offer-面试题62:圆圈中最后剩下的数字-“约瑟夫环问题” ArrayList、数学解法(转载)
这里是题目描述:剑指Offer-面试题62:圆圈中最后剩下的数字本题叫做 “约瑟夫环问题” 有两种解法:1.模拟执行整个删除数字的流程 2.以数学规律解题。这里是LeetCode官网中的两种解题方法详细描述方法一:ArrayList模拟执行整个流程从理论上分析,使用链表时确定删除数字的位置需要O(n),删除该数字需要O(1),一共需要执行n-1次删除;使用ArrayList确定删除数字的位置...原创 2020-03-30 17:39:21 · 183 阅读 · 0 评论 -
剑指offer-面试题41:数据流中的中位数
这里是题目描述:剑指offer-面试题41:数据流中的中位数本题需要兼顾两方面的时间性能:将从数据流中读的数字存储下来的时间性能寻找并返回数据流中的中位数的时间性能。考虑使用什么数据结构来进行数据流数字的存储,未排序的数组、排序后的数组、链表均不能同时满足上述两方面的较高的时间性能。在这里,我们使用 堆 来进行存储双堆求中位数解法我们使用两个堆结构:一个大顶堆存储数据流中数字排序后的前半部...原创 2020-03-27 16:51:04 · 106 阅读 · 0 评论 -
剑指offer-面试题39:超过一半的数字
这里是题目描述:剑指offer-面试题39:超过一半的数字本题可以用哈希表、摩尔投票和寻找中位数三种方法解决。使用哈希表的方法我们不进行介绍,相信大家可以自行完成,这里提供摩尔投票和寻找中位数两种方法方法一:摩尔投票摩尔投票是一种能在O(n)时间复杂度和O(1)空间复杂度上寻找数组多于1/2、1/3…数字的方法作者在之前的博文中对摩尔投票有介绍,传送门:摩尔投票...原创 2020-03-27 16:21:36 · 160 阅读 · 0 评论 -
剑指offer-面试题3:数组中重复的数字 解法
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组numbers {2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2这道题我将提供三种解法:1.使用java提供的集合类的解法 2.使用长度为n的boolean数组记录重复情况...原创 2020-02-18 15:57:57 · 182 阅读 · 0 评论