
nowcoder
FrostMonarch
这个作者很懒,什么都没留下…
展开
-
打印数组中出现超过N/K的数字(复杂度O(n*k) 空间复杂度O(k))
先看一到入门题,这里k=2剑指 Offer 39. 数组中出现次数超过一半的数字难度简单34数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2解题思路:对于一般的k=2,我们都知道需要有一个候选人,其实k>2我们只需要k-1个候选人即可。所以我们可以用k个桶做个hash,存放这k-1个候选人,桶容量够我们就...原创 2020-06-21 17:19:18 · 295 阅读 · 0 评论 -
表示数值的字符串(状态转移)
面试题20. 表示数值的字符串难度中等19请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"、"-1E-16"及"12e+5.4"都不是。注意:本题与主站 65 题相同:https://leetcode-cn.com/problems/valid-number/状态转移在dp中用的比较多,不过dp里面的状态没有像这题一样这么多.原创 2020-06-13 17:21:14 · 267 阅读 · 0 评论 -
拼多多 2020校园招聘 二维表第k大数(二分)
在一块长为n,宽为m的场地上,有n✖️m个1✖️1的单元格。每个单元格上的数字就是按照从1到n和1到m中的数的乘积。具体如下n = 3, m = 31 2 32 4 63 6 9给出一个查询的值k,求出按照这个方式列举的的数中第k大的值v。例如上面的例子里,从大到小为(9, 6, 6, 4, 3, 3, 2, 2, 1)k = 1, v = 9k = 2, v = 6k = 3, v = 6...k = 8, v = 2...原创 2020-06-09 19:22:10 · 1081 阅读 · 0 评论 -
拼多多 2020校园招聘 骰子期望(古典概型,互斥)
扔n个骰子,第i个骰子有可能投掷出Xi种等概率的不同的结果,数字从1到Xi。所有骰子的结果的最大值将作为最终结果。求最终结果的期望。解题思路:这里我们需要用古典概型计算每一个取值的概率,然后再算期望。我们知道,总共的可能性是:...原创 2020-06-09 17:37:14 · 1207 阅读 · 0 评论 -
拼多多 2020校招 多多的电子字典(字典树前缀搜索,DP)
多多鸡打算造一本自己的电子字典,里面的所有单词都只由a和b组成。每个单词的组成里a的数量不能超过N个且b的数量不能超过M个。多多鸡的幸运数字是K,它打算把所有满足条件的单词里的字典序第K小的单词找出来,作为字典的封面。解题思路:首先,答案最终的输出为上面这棵字典树的先序输出第k次。当然这棵树的a.b数量不能超过题目给的a,b数量。我们在先序输出的时候可以判断它的左子树的节点数是否小于k,是的话,我们左子树就可以不访问了。为此我们需要计算一个量dp[n][m][sta];当sta == 0时,原创 2020-06-09 17:27:31 · 2250 阅读 · 0 评论 -
拼多多 2020校招 多多的排列函数(找规律 构造)
数列 {An}为N的一种排列。例如N=3,可能的排列共6种: 1 2 3 4 5 6 1, 2, 3 1, 3, 2 2, 1, 3 2, 3, 1 3, 1, 2 3, 2, 1 定义函数F:其中|X|表示X的绝对值。现在多多鸡想知道,在所有可能的数列 {An} 中,F(N)的最小值和最大值分别是多少。解题思路:我们发现,只要把连续的4个数倒着放...原创 2020-06-09 17:15:22 · 1508 阅读 · 8 评论 -
剑指offer 二叉搜索树的第k个结点(二叉搜索树的中序遍历)
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。解题思路:我们知道二叉搜索树的中序遍历就是排序好的数列。所以我们只需中序遍历到第k个,我们就认为得到答案了。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : ..原创 2020-05-23 19:09:25 · 129 阅读 · 0 评论 -
剑指offer 数据流中的中位数(思维,堆)
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解题思路:假设我们已经有数字 1 2 3 4 5 6 7 8,那么我们可以把前半部分的4个数字做一个大堆big,后4个数字做一个小堆small。然后(big.top()+small.top())/2即为答案。这原创 2020-05-23 18:45:16 · 199 阅读 · 0 评论 -
剑指offer 序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,..原创 2020-05-23 16:06:57 · 134 阅读 · 0 评论 -
剑指offer 对称的二叉树(思维)
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路:正规的解法是传入两个节点,然后判断它们是不是对称的。因为按照对称二叉树的定义,就是需要一层一层判断是否是对称的。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(原创 2020-05-23 14:23:24 · 130 阅读 · 0 评论 -
剑指offer 字符流中第一个不重复的字符(思维,队列)
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。解题思路:容易想到用队列来存储返回字符,但是一旦字符出现2次,我们总不能又把队列重新扔出来再扔回去(其实可以,复杂度同样是常数),这里我们可以用一个小技巧,每次检查队列的首个元素时,我们可以检查它的重复出现次数,若出现多于1次,我们就pop队列。class Solution原创 2020-05-20 19:31:29 · 178 阅读 · 0 评论 -
剑指offer 正则表达式匹配 (思维,动态规划)
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配解题思路:首先,我们必须发现一些事实。在从左往右匹配中只可能出现这两种情况。我们假设str1为字符串,str2为模式串。pos1为str1开始匹配的位置,pos2为str2开始匹配的位置。(1原创 2020-05-20 18:37:24 · 270 阅读 · 0 评论 -
剑指offer 数组中只出现一次的数字(位运算)
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路:无脑map可以做,这里不讨论。另外,我们可以根据异或的性质,相同的数字异或为0,所以我们将所有的数字异或得到一个结果,找到结果中的二进制表示位中的第一个1的位置pos(其实任意位置的1都可以,注意肯定有1,不可能为0),然后把数字分为两组,第一组是pos位置为1的,以及剩下的。然后第一组内的数字进行异或得到答案1,第二组数字内的数字异或得到答案2.class Solution原创 2020-05-19 17:58:53 · 178 阅读 · 0 评论 -
剑指offer 整数中1出现的次数(思维)
题目大意:在[1,n]中,统计 所有 数位上包含的1数字,总共1的个数。比如 [1,11] 数位包含1的数字有: 1 10 11 总共有1 + 1 + 2 = 4 个1.解题思路:这题我们需要逐个数字位置上思考,个位对答案的贡献,十位对答案的贡献。。。这里有一个key,我们这样最后答案的组成。比如数字 n = 2134:那么从个位开始看:所有的数字的组成可以看为 [0,2130] ...原创 2020-05-07 11:53:01 · 194 阅读 · 0 评论 -
腾讯2020 逆序对(堆排,思维)
题目大意:现在有2^n个数,我们总共有m次操作,每次操作我们可以让每2^k(k<=n)个数进行一次反转,现在问我们,每进行一次操作逆序对的个数是多少。解题思路:这里,我们需要发现,由于是每2^k进行一次反转,所以对2^(k+1)个数的逆序对是没影响的。具体如图:假设我们需要翻转绿色内的数字,那么红色圈圈内的跨越绿色圈圈的逆序对是没有任何影响的。那么,我们从这里出发,考虑维...原创 2020-04-13 21:58:52 · 1017 阅读 · 0 评论 -
快手2020 石头碰撞 (01背包)
题目大意:有n(n<=100)个石头,每次我们可以选择2个石头让其碰撞,产生的新石头的重量为abs(x-y),其中x,y为原来的两个石头的重量,问我们怎么选取石头才能让最后的石头重量最轻。石头重量和<= 1e5解题思路:显然,这题需要DP来解决,但是我们乍看之下很难确定这个dp的状态,题目其实数据范围给了一定的提示,我们的状态最好设定为这样dp[n][weight],n是个...原创 2020-04-08 11:39:57 · 698 阅读 · 0 评论