
思维
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 评论 -
leetcode 283. 移动零(思维)
题目大意:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。解题思路:我们需要维护一个变量是 在我们遍历的过程中出现的第一个0的位置lsz,然后每次交换lsz和当前遍历的元素,假如当前遍历的元素不为0.class Solution {public: void moveZeroes(vect原创 2020-06-01 21:42:16 · 164 阅读 · 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 整数中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 评论 -
剑指offer 字符串的排列(思维)
题目大意:有n个字母,现在让我们从从字典序由小到大输出。n<=9.解题思路:输出全排列那么复杂度O(n!)肯定逃不掉,这里提供一个O(n * n!)输出字典序从小到大的方法。那么已知一个排列,怎么输出比它大的字典序的排列呢?首先,我们从右到左扫,维护一个后缀最大值,假如当前元素小于后缀最大值,那么我们认为这个元素是可以被后面的较大的元素替换,从而找到字典序更大的。(为...原创 2020-05-05 21:18:05 · 142 阅读 · 0 评论 -
剑指offer 二维数组中的查找 (思维)
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:r = 0, c = mat.column设初始指针(r,c),那么mat[r][c] == target就退出,否则 若 mat[r][c]>target那么我们可以...原创 2020-04-30 19:39:39 · 146 阅读 · 0 评论 -
codeforces 1336C - Kaavi and Magic Spell(思维,区间DP)
题目大意:已知有字符串s,t。每次我们可以从左开始,选择s的字符,选择好的字符可以放在a的左边或者右边(a原始为空)。现在问我们,有多少种不同的放法可以使得a的前缀是t.s,t长度为n, n<=1e3.解题思路:这里我们考虑使用区间DP,设dp[l][r] 为a成功匹配t时候,[l,r]满足要求的串的个数(满足要求指:前缀是t,后面是任意字符的情况)。那么我们可以模拟这个过程...原创 2020-04-22 15:05:49 · 274 阅读 · 0 评论 -
腾讯2020 逆序对(堆排,思维)
题目大意:现在有2^n个数,我们总共有m次操作,每次操作我们可以让每2^k(k<=n)个数进行一次反转,现在问我们,每进行一次操作逆序对的个数是多少。解题思路:这里,我们需要发现,由于是每2^k进行一次反转,所以对2^(k+1)个数的逆序对是没影响的。具体如图:假设我们需要翻转绿色内的数字,那么红色圈圈内的跨越绿色圈圈的逆序对是没有任何影响的。那么,我们从这里出发,考虑维...原创 2020-04-13 21:58:52 · 1017 阅读 · 0 评论 -
leetcode 5353 灯泡开关(规律)
题目大意:已知有n个灯泡。每个灯泡有off,on和变蓝三个状态。on灯泡要变蓝的充要条件是:所有on的灯泡必须从左到右排列。已知刚开始所有的灯泡都是off,给定一个按照时间变化的亮灯的序列,问我们总共有哪几个时刻所有on的灯泡是蓝的。解题思路:用数组记录每个灯泡on着的话,最左和最右可以延伸到哪里。然后询问当前灯泡on是否能够延续到0,另外询问是否有灯泡比它最右的灯泡还要远。其中最...原创 2020-03-08 18:16:05 · 446 阅读 · 0 评论 -
codeforces C - Kuroni and Impossible Calculation(思维)
题目大意:已知一串数An,现在让我们算,其中1<=i,j<=n, 或者我们可以理解为n<=1e5,m<=1e3.解题思路:分类讨论:n<=m时,我们可以暴力算。当n>m时,那么An中肯定有其中两个项的模m后相等,所以这一项在连乘后贡献出0,所以结果为0.这题很巧妙的一点是,通过这样的分类后,模的性质发挥了作用,很巧妙。#includ...原创 2020-03-04 21:26:13 · 355 阅读 · 1 评论