文章分类 - 算法巧解
刷题的时候遇到的一些很巧妙的解法
摘要:原题在这里: 概述题意,给定一个二叉树,要求转换为右子节点连接起来的单链表。 analyse: 没啥好说的,很普通的转换,写了递归和迭代两个版本。 code: class Solution { TreeNode *dfs(TreeNode *n) { if (!n) return nullptr;
阅读全文
摘要:原题在这里: 概述题意,给定二叉树和一个targetsum值,问在二叉树中连续(父子节点)片段,其和为targetsum的数量。 节点定义: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0)
阅读全文
摘要:原题在这里: 概述题意,给定一个字符串数组和两个指定字符串x,y,问xy在数组内的最小下标间距。 analyse: 很不好意思的是,这个题目我想复杂了,如下: 运用链式前向星,将每一个字符串的哈希值与其下标相连成边,建边完成后,双指针遍历两个字符串的下标数组得到ans。 实际上,在数组遍历建边过程中
阅读全文
摘要:原题在这里: 概述题意,给定一个数组x,返回一个数组y,y内每一个元素i值表示x从i开始左往右小于x[i]的递增元素数量。 (经典题目表示没能做出来有点菜) analyse: 1.很自然地想到用单调栈来解题,但是思路不太对,从左往右构造单增栈: 对于每一个height: 如果当前stack.top更
阅读全文
摘要:原题在这里: 概述题意,要求比O(n)复杂度更好的求出完全二叉树的节点数量的算法。 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullpt
阅读全文
摘要:原题在这里: 概述题意,给定一个m*n的乘法表,问第k小的数字。 analyse: 我就只能想到这个乘法表是主对角线对称,然后就没有然后了,发呆ing。 标准解法: 找第k小的数字->二分查找数字x,利用k对于小于x数的数字进行二分。 每一行i,有min(x/i,n)个小于x的数字,遍历即可 优化,
阅读全文
摘要:原题在这里: 概述题意,给定一个无序可重复元素数组,问数组中构成的最长连续数值长度。 要求O(n)时间复杂度。 analyse: 1.初始想法,set+mp遍历,时间复杂度还行。 code: class Solution { public: int longestConsecutive(vector
阅读全文
摘要:原题在这里: 概述题意,给定一个字符串数组和一个target字符串,问能否用使用字符串数组中字符串最少次数拼接出target字符串,如果不能则-1。 analyse: 很基础的想法: 桶存遍历target,再遍历一边字符串数组,先验证是否能拼凑出同时,存入字符串数组中每一个字符串的桶存字符,以便在b
阅读全文
摘要:原题在这里: 概述题意:要求在常数额外空间条件下处理数组元素保证重复次数不超过2次,修改数组并返回数组长度。 analyse: 属于是经典题目了,双指针,左指针为实际数组下标,右指针移动进行判定。 初始code: class Solution { public: int removeDuplicat
阅读全文
摘要:原题在这里: 题意:实现满足O(1)时间复杂度的get和put操作的LRU算法。 analyse: 1.第一次做的时候,选用了图论中链式前向星+set哈希处理的解法 思路:翻译为图,也就是找num时间戳在capacity范围内的边 对于每一个key,就当作一个节点,每指向一个value就是一条边 g
阅读全文
摘要:原题在这里: 概述题意:在给定数组中,满足所有元素只出现一次或两次,找出所有出现两次的元素。 analyse: 1.我原本思考点是考虑异或运算,利用偶数次异或运算结果为0来处理数据,但是并不能实现,所有元素的异或结果无法利用。 2.标准解法为,标记法,将x=num[i]所指向下标为x-1元素赋值为负
阅读全文
摘要:一个会员题: 概述:问给定字符串中是否无重复字符(如果不适用额外数据结构会加分) analyse: 1.n^2暴力,n+logn排序+遍历 2.思考过位运算,因为有异或操作,但是只适用于在偶数次中找奇数次,这里不是很符合。 3.标准解法还是位运算: 如果字符只有a-z字符26个,考虑int类型有32
阅读全文
摘要:原题在这里: 概述题意:给定初始和结束字符串和字符串数组,问每次只固定变化一个单词,最少变化次数,没有则-1。 analyse: 字符串最短路,没啥好多说的,之前写过两次:here 思路如下: 将初始和字符串数组内的字符串的所有子串转入一个sub二维数组中,用map对每一个sub字符串记录id,另外
阅读全文
摘要:原题在这里: 概述题意,问给定字符串s中有多少个子串是回文串,不同下标构成的子串视为不同子串。 analyse: 1.暴力,数据范围只有1e3,substr+reverse暴力判断 code: class Solution { bool check(string s) { string x = s;
阅读全文
摘要:随便刷几个天梯赛题目。 原题在这里 概述题意,给定完全二叉树的后序遍历,问层序遍历结果。 analyse: 1.刚开始很认真的逆序建树,写得不是很顺畅,因为我不喜欢这种数据关系类型的题目。 code: #include <bits/stdc++.h> using namespace std; #de
阅读全文
摘要:原题在这里: 概述题意,相比于I,这里多了要求出输出所有最短路径。 analyse: 1.在队列元素里增添一个vector<string>属性即可 code: class Solution { struct iis { int x; int y; vector<string> s; friend b
阅读全文
摘要:原题在这里: 概述题意,给定一个数组,每次操作能使n-1个数字增加1,问最少多少次能让数组内所有元素相同。 analyse: 这题居然是简单题,我确实没想到,做了很久, 正向思考:每次处理n-1个元素+1 反向思考:每次处理1个元素-1 那么正向加到相同,等于反向减到最小。 code: class
阅读全文
摘要:原题在这里: 概述题意,问一个字符串是否由其子串重叠n次构成(n>=2)。 analyse: 我直接就是kmp解法,利用了next数组的性质之一: next[i],表示在i位置匹配的最长前缀 i-next[i],表示失配时候,下一次匹配的右移距离 对于next[i],有next[i]&&i%(i-n
阅读全文
摘要:原题在这里: 概述题意:给定n,问在[0,10^n)区间范围内有多少个数满足各位上的数都不同。 analyse: 很标准的排列数学题目,但是,但是,但是,我想了很久,甚至百度了排雷组合的公式... 实际上很简单的,因为位数一定不同,那么对于从前往后的可选数字数量数组即为: [9,9,8,7,6,5,
阅读全文
摘要:原题在这里: 概述题意:给定一个字符串,在可以删除一个字符的条件下,问是否是回文串。 analyse: 1.刚开始我就想到翻转硬比较: 比较到不等的地方有一个标记,考虑删除 当前位 或者 对称位 code: class Solution { public: bool validPalindrome(
阅读全文