随笔分类 - 剑指offer
摘要:剑指 Offer 40. 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 思路 方法一:排序 对原数组从小到大排序后取出前 k 个数即可。时间复杂度为O(nlogn) 方法二:堆 用一个大根堆实时
阅读全文
摘要:剑指 Offer 19. 正则表达式匹配 题目 请实现一个函数用来匹配包含'. '和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"
阅读全文
摘要:剑指 Offer 53 - I. 在排序数组中查找数字 I 统计一个数字在排序数组中出现的次数。 思路 这题主要考察 lower_bound 和 upper_bound 的使用 upper_bound 减去 lower_bound 就是出现的次数 upper_bound:大于元素的第一个位置 low
阅读全文
摘要:剑指 Offer 52. 两个链表的第一个公共节点 输入两个链表,找出它们的第一个公共节点。 思路 思路一:使用 map 记录已经访问的节点 思路二:使用双指针,可以将空间复杂度将至 O(1) 设 A, B 两个链表,公共节点前的长度分别为 a, b, 公共节点的长度为 c,则 A 的长度为a+c,
阅读全文
摘要:剑指 Offer 51. 数组中的逆序对 求逆序对的例题 思路 求逆序对一般有两种解法:1 是归并排序,2是树状数组,使用树状数组的时候一般需要对数据进行你离散化,而归并排序不需要。 归并排序是在归并的时候进行答案统计,因为归并的时候两个序列都是有序的,所以如果左序列的某一个元素大于右序列的某个元素
阅读全文
摘要:剑指 Offer 49. 丑数 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 思路 方法一:堆 + 哈希去重 方法二:动态规划 代码 堆 + 哈希去重 typedef long long ll; class Solution { p
阅读全文
摘要:剑指 Offer 48. 最长不含重复字符的子字符串 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 代码 能用 unordered_set 还是用 unordered_set 吧,虽然慢了点。 class Solution { public: int lengthO
阅读全文
摘要:剑指 Offer 47. 礼物的最大价值 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物? 代码 为了不
阅读全文
摘要:剑指 Offer 46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 思路 动态规划或深度优
阅读全文
摘要:剑指 Offer 45. 把数组排成最小的数 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 思路 贪心算法 代码 class Solution { public: static bool cmp(const string& a, const stri
阅读全文
摘要:剑指 Offer 44. 数字序列中某一位的数字 数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。 请写一个函数,求任意第n位对应的数字。 思路 首先确定这个位所在数字的位数,然后在确定
阅读全文
摘要:剑指 Offer 43. 1~n 整数中 1 出现的次数 输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。 例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。 思路 对于每一位考虑1出现的个数,比如对于百位,从0 开始每1000个数字百位上的
阅读全文
摘要:剑指 Offer 42. 连续子数组的最大和 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 代码 class Solution { public: int maxSubArray(vector<int>& nums) { int
阅读全文
摘要:剑指 Offer 41. 数据流中的中位数 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2
阅读全文
摘要:剑指 Offer 39. 数组中出现次数超过一半的数字 题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 思路 方法一:哈希表 通过一个 hashmap 记录每个数的个数,如果大于一半就输出。 方法二:排序 排序,然后最中
阅读全文
摘要:剑指 Offer 38. 字符串的排列 题目 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 思路 因为有重复字符,所以不能通过记录哪个使用了哪个没使用来 dfs。而是统计所有不重复的字符,并记录每个字符的个数,然后进行 dfs。 方法二
阅读全文
摘要:剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 思路 排序列表:二叉搜索树的中序遍历是有序的 双向链表:设置前驱节点 pre 和当前节点 cur,pre.right = cur,
阅读全文
摘要:剑指 Offer 37. 序列化二叉树 题目 请实现两个函数,分别用来序列化和反序列化二叉树。 你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 思路 序列化:将二叉
阅读全文
摘要:剑指 Offer 35. 复杂链表的复制 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 思路 在复制的时候用哈希表保存原链表的节点到新链表节点的对应关系,
阅读全文
摘要:剑指 Offer 33. 二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 思路 后序遍历是 左子树 + 右子树 + 根,左子树全小于根,右子树全大于根,dfs判断即可 待填
阅读全文