
【魂】算法
文章平均质量分 75
主要刷各大Oj网站、求职网站上的算法题
Do Better
个人博客xdbblog.com
人生如一场修行,得意时,一日看尽长安花,艰难时,潦倒新停浊酒杯,但生命的跋涉不能回头,哪怕,畏涂巉岩不可攀,也要会当凌绝顶,哪怕无人会 登临意,也要猛志固常在,从生活中,汲取九万里风鹏正举的力量,历练也无风雨也无晴的豁然,待到重阳日,我们还来就菊花。
展开
-
【牛客网】腾讯2018春招技术类编程题汇总
1-翻转数列思路感觉此道题有点找规律,取数据的时候,按奇偶性进行选取,但我这种方法只能过60%代码#include<iostream>using namespace std;//过60%int main() { long long n, m; while (cin >> n >> m) { long long sum = 0; for (long long i = 1; i <= n; i++) { if ((i - 1) / m %原创 2020-09-03 12:23:59 · 504 阅读 · 0 评论 -
【牛客网】字节跳动2019春招研发部分编程题汇总
1-万万没想到之聪明的编辑解题思路此题的编辑规则如下三个同样的字母连在一起,一定是拼写错误,去掉一个的就好啦:比如 helllo -> hello两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC从题目可以看出,本题的规则实际上只有两个,1和2,1是指连续3个同样的字母,则去掉一原创 2020-09-02 12:07:14 · 843 阅读 · 0 评论 -
【牛客网】腾讯2020校园招聘笔试题
1-压缩算法思路从内向外替换,right代表从左侧开始第一个开始的’]‘位置,left代表与当前’]‘对应的’[‘位置,k记录’|‘位置在遍历时,将’[‘和’|‘的位置分布入栈,当读到’]'时弹出参考自该博客代码#include<iostream>#include<string>#include<stack>using namespace std;/*思路:从内向外替换,right代表从左侧开始第一个开始的']'位置,left代表与当前'原创 2020-09-01 11:06:33 · 978 阅读 · 0 评论 -
【LeetCode】15. 三数之和
解题思路代码#include<iostream>#include<vector>#include<algorithm>using namespace std;class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> ans;原创 2020-08-18 15:06:14 · 151 阅读 · 0 评论 -
【LeetCode】1. 两数之和
解题思路在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。时间复杂度O(n)空间复杂度O(n)代码#include<iostream>#include<vector>#include<unordered_map>using namespace std;class Solution {public: vector<int> twoSum原创 2020-08-18 15:04:40 · 140 阅读 · 0 评论 -
【LeetCode】146. LRU缓存机制
思路参考自LRU 策略详解和实现采用的数据结构:双向哈希链表代码#include<iostream>#include<algorithm>#include<unordered_map>using namespace std;struct Node{ int key; int value; Node* pre; Node* next; //构造函数初始化 Node(int key, int value) :k原创 2020-08-15 13:27:56 · 182 阅读 · 2 评论 -
【剑指Offer】61. 扑克牌中的顺子
解题思路参考自面试题61. 扑克牌中的顺子(集合 Set / 排序,清晰图解)满足顺子的条件1、除大小王外,所有牌无重复;2、除此5张牌中最大的牌为max,最小的牌为min(大小王除外),则需满足:max-min<5时间复杂度O(NlogN),此处N=5,数组排序使用NlogN空间复杂度O(1)代码class Solution {public: bool isStraight(vector<int>& nums) { int numsWa原创 2020-08-15 10:19:16 · 205 阅读 · 1 评论 -
【剑指Offer】60. n个骰子的点数
思路第一步:定义数组元素的含义dp[i][j],表示投掷完i枚骰子后,点数j的出现次数第二步:找出关系数组元素间的关系式最后一个阶段也就是投掷完 n 枚骰子后的这个阶段,我们用dp[n][j] 来表示最后一个阶段点数 j 出现的次数。单单看第 n 枚骰子,它的点数可能为 1 , 2, 3, ... , 6 ,因此投掷完 n 枚骰子后点数 j 出现的次数,可以由投掷完 n-1 枚骰子后,对应点数 j-1, j-2, j-3, ... , j-6 出现的次数之和转化过来。因此,第i枚骰子投掷后,出现的原创 2020-08-07 11:29:41 · 308 阅读 · 0 评论 -
【LeetCode】56. 合并区间
解题思路1、排序,按照区间的左端点大小进行排序,使用默认排序规则即可2、从i=0开始遍历排序后的数组,使用左指针指向区间的左端点,右指针指向右端点3、对从i+1开始的数组,判断右指针是否会大于第j个区间的左端点,如果是,则说明可以更新右指针,直到小于第j个区间的左端点为止4、将左指针和右指针压入结果数组ans中。5、更新i值为j,即从断开的区间开始进行遍历代码class Solution {public: vector<vector<int>> merge(vect原创 2020-08-06 10:51:24 · 182 阅读 · 0 评论 -
【剑指Offer】 56 - II. 数组中数字出现的次数 II
解题思路参考自面试题56 - II. 数组中数字出现的次数 II(位运算 + 有限状态自动机,清晰图解)考虑数字的二进制形式,对于出现3次的数字,各二进制位出现的次数都是3的倍数。因此,统计所有数字的各二进制位中1的出现次数,并对3求余,结果则为只出现一次的数字注意,每一个二进制位上的个数求余后一定是1或是0,而不会是比3小的其他数。步骤:1、遍历nums数组,建立一个长度为32的数组counts,通过与运算和右移操作,获得所有数字的各二进制位的1的出现次数2、遍历counts数组利用左移原创 2020-08-05 10:19:42 · 481 阅读 · 0 评论 -
【剑指Offer】 56 - I. 数组中数字出现的次数
解题思路本题有很多种解法,但由于题目进行了限制,因此只能采用位运算的方法才能满足。异或运算有以下三个性质移位运算:>> 每右移1位,相当于除2与运算:& 判断为奇数还是偶数对于此题的一个简化版的题目136. 只出现一次的数字136题可以通过一次遍历的方式直接求解。而本题由于有两个出现的数字,因此如果可以拆分成两个数组,就可以通过136题的方法进行求解。如果从头到尾依次异或当前的数组的元素,我们的结果将是两个只出现一次的数字异或的结果,由异或的性质可知,两个数相同为0,不同原创 2020-08-04 10:58:28 · 187 阅读 · 0 评论 -
【剑指Offer——待进一步理解】 44. 数字序列中某一位的数字
代码class Solution {public: int findNthDigit(int n) { int digit = 1; long start = 1; long count = 9; while (n > count) { n -= count; digit += 1; start *= 10; count = digit * start * 9; } long num = start + (n - 1) / digit; ret原创 2020-07-19 17:35:16 · 147 阅读 · 0 评论 -
【剑指offer】46. 把数字翻译成字符串
解题思路第一步:定义数组元素的含义题目要求的是一个数字有多少种不同的翻译方法,因此设dp[i]代表第i个结尾的数字的翻译方案数量第二步:找出关系数组元素间的关系式若xix_{i}xi和xi−1x_{i-1}xi−1组成的数字可以被翻译,则dp[i]=dp[i-1]+dp[i-2],xi−1xiϵ[10,25]x_{i-1}x_{i}\epsilon [10,25]xi−1xiϵ[10,25];否则dp[i]=dp[i-1],xi−1xiϵ[1,10)∪(25,99]x_{i-1}x_{i原创 2020-07-19 16:47:56 · 179 阅读 · 0 评论 -
【剑指offer】45. 把数组排成最小的数
解题思路通过题意可知,不管这些数字如何排列,形成的数字位数时不变的。所以如果高位的数字越小,则最终的结果也就越小。下面的n为数字的个数对于n=2的情况如[26,38],根据高位越小越好,可知,我们应该排列成2638对于n>2的情况如[26,29,1],根据我们定义的规则,一定是将第一位小的数字放在最高位,因此先选出1,对于剩下两个数字,由于第1位数字相同,我们会比较第2位,因此我们最终会排列成12629从上面我们可以发现的排序规则就是,如果第1位小,就将其排到最前面,如果第1位相等,则比原创 2020-07-19 15:18:36 · 218 阅读 · 0 评论 -
【LeetCode】215. 数组中的第K个最大元素
解题思路方法一使用快速排序中的Partition函数,获得第j位上的元素,如果第j位和k-1相同,则直接返回即可时间复杂度O(N)代码#include<vector>class Solution {public: int findKthLargest(std::vector<int>& nums, int k) { int start = 0; int end = nums.size() - 1; int原创 2020-07-15 15:50:28 · 200 阅读 · 0 评论 -
【剑指offer】36. 二叉搜索树与双向链表
思路算法流程:Node* treeToDoublyList(Node* root)1.特例处理:若结点root为空,直接返回2.转化为排序双向链表:调用inorder(Node* root)3.构建循环链表:head和pre双向结点引用4.返回头结点void inorder(Node* root)中序遍历的改写,在访问根节点时,同时更新pre,head的值,使其能够双向连接代码class Solution {public: Node* pre=nullptr, *head;//原创 2020-07-10 11:45:31 · 192 阅读 · 0 评论 -
【剑指offer】35. 复杂链表的复制
解题思路算法流程:建立映射对新链表结点和原链表结点建立hashmap的映射关系,原链表结点为key,新链表结点为value赋值通过hashmap将原链表的next,random所指结点赋给新链表,注意赋值时,要判断该两值是否不为空,因为建立hashmap时,没有建立null,null的映射返回新链表头结点hashmap[head]代码class Solution {public: Node* copyRandomList(Node* head) {原创 2020-07-10 10:44:38 · 173 阅读 · 0 评论 -
【剑指offer】33. 二叉搜索树的后序遍历序列
思路1.确定根节点2.遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树3.遍历右子树,若发现有小于root的值,则直接返回false;4.分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)代码class Solution {public: bool verifyPostorder(vector<int>& postorder) { if (postorder.empty()) return原创 2020-07-09 19:39:31 · 347 阅读 · 0 评论 -
【数据结构与算法】二叉树的遍历方法总结
先序遍历递归版非递归版中序遍历递归版非递归版后序遍历递归版非递归版层序遍历#include<iostream>#include<queue>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NU原创 2020-07-09 15:44:58 · 215 阅读 · 0 评论 -
【剑指offer】31. 栈的压入、弹出序列
解题思路算法流程:初始化,辅助栈tempS和弹出序列的索引i遍历压入序列pushed压入pushed的元素e判断tempS是否为空且栈顶元素和popped[i]相等tempS出栈i++3.返回tempS.empty(),如果其为空,说明合法,反之不合法代码class Solution {public: bool validateStackSequences(vector<int>& pushed, vector<int>&原创 2020-07-09 15:14:52 · 156 阅读 · 0 评论 -
【剑指offer】21. 调整数组顺序使奇数位于偶数前面
解题思路双指针,p1指向头,p2指向尾,p1在遇到偶数时停下,p2在遇到奇数时停下,如果此时p1<p2,则进行交换代码class Solution {public: vector<int> exchange(vector<int>& nums) { int p1 = 0, p2 = nums.size() - 1; while (p1<p2) { while (p1 <原创 2020-07-07 10:55:43 · 145 阅读 · 0 评论 -
【LeetCode】134. 加油站
思路暴力法暴力破解,一方面验证自己对题目的理解是否正确,另一方面后续的优化也可以从这里入手。1、考虑从第0个点出发,能否回到第0个点。2、考虑从第1个点出发,能否回到第1个点。3、考虑从第2个点出发,能否回到第2个点。… …4、考虑从第n个点出发,能否回到第n个点。代码//暴力法class Solution {public: int canCompleteCircuit(v...原创 2020-04-26 18:04:15 · 239 阅读 · 0 评论 -
【LeetCode】面试题51. 数组中的逆序对
解题思路分治法:采用的就是归并函数中的分治思想,该题与分治排序的不同点在于,在治的过程中进行逆序对的统计,逆序对的个数为cnt += center - i + 1;这也是在归并排序上要加的代码代码/*思路:分治通过分的方式,获得每个子区间,在合并每个子区间时计算每个子区间内部的逆序对个数*/#include<iostream>#include <vector&...原创 2020-04-24 11:30:27 · 271 阅读 · 0 评论 -
【LeetCode】409. 最长回文串
思路若要形成最长的回文串,则回文串中只会出现1次单个字符,因此只需统计字符串中有多少个字符其数目为奇数,s.size()-n个为奇数个数的字符+1即为最长回文串如果字符串没有出现奇数个数目的字符,则s.size()即为最长回文串代码class Solution {public: int longestPalindrome(string s) { unordered_map<c...原创 2020-03-20 00:19:45 · 138 阅读 · 0 评论 -
【LeetCode】142. 环形链表 II
解题思路hashmap法思路简单,时间复杂度O(n),空间复杂度O(n)Floyd法知道结论进行编程容易,但是自己推导出Floyd公式比较难,理解该方法,进行编程即可时间复杂度O(n),空间复杂度O(1)代码hashmap法class Solution {public: ListNode* detectCycle(ListNode* head) { if (head == ...原创 2020-03-17 20:48:23 · 152 阅读 · 0 评论 -
【LeetCode】141. 环形链表
代码方法1 hash表class Solution {public: bool hasCycle(ListNode* head) { //特判 if (head == nullptr || head->next == nullptr) return false; unordered_map<ListNode*,int> list; ListNode* cu...原创 2020-03-17 13:13:13 · 144 阅读 · 0 评论 -
【LeetCode】516. 最长回文子序列
思路其实就是求s和s的逆序的最长公共子序列的。转化成最长公共子序列问题就迎刃而解了。代码class Solution {public: int longestPalindromeSubseq(string s) { string s2(s); //s2反转 reverse(s2.begin(), s2.end()); //定义状态 //s的前i个字符和s2的前j个字符...原创 2020-03-17 11:45:05 · 186 阅读 · 0 评论 -
【LeetCode】647. 回文子串
思路思路同最长回文子串,只不过此题再开辟一个变量记录回文子串出现的次数即可代码class Solution {public: int countSubstrings(string s) { vector<vector<bool>> dp(s.size(), vector<bool>(s.size())); //初始化 int ans = 0...原创 2020-03-17 10:51:18 · 258 阅读 · 0 评论 -
【LeetCode】1160. 拼写单词
思路 哈希表计数对于一个单词word,只要其中的每个字母数量都不大于chars中对应的字母的数量,那么就可以用chars中的字母拼写出word。所以我们只需要用一个哈希表存储chars中每个字母的数量,再用一个哈希表存储word中每个字母的数量,最后将两个哈希表的键值逐一进行比较即可。代码class Solution {public: int countCharacters(vecto...原创 2020-03-17 10:30:52 · 207 阅读 · 0 评论 -
【LeetCode】5. 最长回文子串
思路1、定义数组元素的含义/定义状态dp[i][j]表示S[i]至s[j]所表示的子串是否是回文子串,是则为1,不是为0.2、找出数组间的关系式dp[i][j]={ dp[i+1][j-1],S[i]==S[j] 0,S[i]!=S[j]}3、找出初始值dp[i][i]=1,dp[i][i+1]=(S[i]==S[i+1])?1:0代码class...原创 2020-03-15 15:49:29 · 133 阅读 · 0 评论 -
【剑指offer】面试题57. 和为s的两个数字
思路刚开始自己的想法,对数组进行遍历,取第一个数时,通过二分法来找target-nums[i],但发现最终这样的代码超时,时间复杂度O(nlogn)改进的想法使用双指针法,左指针指向最小元素,右指针指向最大元素,比较两个指针所指元素的和与target的大小,如果相等,则说明找到,如果sum>target,则左指针++,反之,右指针++代码正确解法class Solution {...原创 2020-03-15 00:14:47 · 229 阅读 · 0 评论 -
【LeetCode】面试题 17.16. 按摩师
解题思路一、定义数组元素的含义dp[i]:第i次预约时,按摩师总预约时间长二、找出关系数组元素间的关系式第i次时,总预约时长,要么是从第i-2次接受预约后,本次也接受预约,要么本次不接受预约dp[i] = max(dp[i - 2] + nums[i-1], dp[i - 1]);三、找出初始值由题目可知,第1次接受预约时,总预约时长为dp[1]=nums[0]代码class S...原创 2020-03-14 21:42:42 · 458 阅读 · 0 评论 -
【LeetCode】面试题 16.17. 连续数列
class Solution {public: int maxSubArray(vector<int>& nums) { if (nums.size() == 0) return 0; vector<int> dp(nums.size()); dp[0] = nums[0]; int sum = dp[0]; for (int i=1;i&l...原创 2020-03-14 18:50:13 · 187 阅读 · 0 评论 -
【LeetCode】面试题 08.01. 三步问题
代码class Solution {public: const int mod = 1e9 + 7; int waysToStep(int n) { vector<int> dp(n+4); dp[0] = 0; dp[1] = 1; dp[2] = 2; dp[3] = 4; for (int i=4;i<=n;i++) { dp[i]...原创 2020-03-14 18:32:32 · 153 阅读 · 0 评论 -
【LeetCode】300. 最长上升子序列
思路一、定义数组元素的含义dp[i]:到第i个元素的时最长子序列的长度二、找出关系数组间的关系式 if (nums[i] > nums[j])//出现上升 { dp[i] = max(dp[j] + 1, dp[i]); }三、找出初始值dp[i] = 1;代码//dp[i]:到第i个元素的时最长子序列的长度class Solution {public: in...原创 2020-03-14 17:49:13 · 116 阅读 · 0 评论 -
【LeetCode】1071. 字符串的最大公因子
思路枚举法从1~min(str1.length(), str2.length())的范围枚举每个子串,对每个子串进行check,判断其是否属于将等于该字符串代码class Solution {public: string gcdOfStrings(string str1, string str2) { if (str1.empty() || str2.empty()) return...原创 2020-03-12 18:01:10 · 147 阅读 · 0 评论 -
【LeetCode】912. 排序数组
本道题目专用于练习排序算法,后续会补齐其他排序算法的代码快速排序分割操作,单向调整class Solution {public: vector<int> sortArray(vector<int>& nums) { QuickSort(nums, 0, nums.size()-1); return nums; } void QuickSort(...原创 2020-03-09 17:27:40 · 266 阅读 · 0 评论 -
【LeetCode】395. 至少有K个重复字符的最长子串
思路分治思想先遍历一遍统计字符串S中每个字母出现的次数,然后再遍历一遍找到出现次数小于k的一个字母对应的位置(partition),包含S[mid]的子串显然不可能符合题目要求,所以原问题求S[l,r]字符串对应的答案等价于求S[l,partition-1]和S[partition+1,r];此外,可以对一些情况进行优化,例如,当l和r所指字符已经不符合题目要求,可以跳过这些字符,以减少计算...原创 2020-03-09 15:10:37 · 176 阅读 · 0 评论 -
【LeetCode】1025. 除数博弈
思路方法一 动态规划第一步:定义数组元素的含义dp[n]:数字为n时,此时取数字者的游戏结果第二步:找出关系数组元素间的关系时假设Alice的dp[i]=false;如果Alice取某个数字后,能使得Bob一定为false,则此时Alice一定胜第三步:找出初始值在n=1时,Alice先取,一定无法获胜dp[1]=false;在n=2时,Alice先取,一定可以获胜 dp[2]=...原创 2020-03-09 10:58:17 · 157 阅读 · 0 评论 -
【LeetCode】746. 使用最小花费爬楼梯
思路第一步:定义数组元素的含义题目的要求的是爬到楼层顶部需要的最低花费。因此可将dp定义为,到达第n阶台阶时的最低花费dp[i]由于最终要到达的是楼顶,所以此处dp的size为cost的size+1。第二步:找出关系数组元素间的关系时要到达下一阶,可以走一步,也可以走两步,要到达位置i,一种是从i-1这个位置走一步到达一种是从i-2这个位置走一步到达因为是要计算走到i位置时,花费最...原创 2020-03-09 00:46:14 · 463 阅读 · 0 评论