leetcode
文章平均质量分 79
五月的天气
承认平凡 不甘平凡
展开
-
leetcode23 合并k个升序链表
记录一下这道题,觉得用堆或者分治思想都很优雅//使用小根堆,优先队列做法class Solution {private: struct cmp{ bool operator () ( ListNode* a, ListNode* b ){ return a->val > b->val; //这里的比较大小每次都弄反。。。 } };public: ListNode* mergeKLists(vect原创 2020-12-30 22:33:08 · 113 阅读 · 0 评论 -
汉明权重(hamming weight) ----- 计算数据位中1的个数
汉明重量是一串符号中非零符号的个数。因此它等同于同样长度的全零符号串的汉明距离(在信息论中,两个等长字符串之间的汉明距离,是两个字符串对应位置的不同字符的个数)。在最为常见的数据位符号串中,它是1的个数。本文参考文章1 文章2在wiki百科中给出,计算1的个数,目前来说最好的是按照树状进行相加(当然比遍历要快很多,遍历就相当于一棵极不平衡的数)下面是variable-precision SWAR算法的实现:uint32_ t swar (uint32_ t i) { //步骤1 .原创 2020-12-26 12:24:33 · 4021 阅读 · 0 评论 -
0x3F3F3F3F——算法比赛中的无穷大常量
在算法竞赛中,我们常常需要用到设置一个常量用来代表“无穷大”。比如对于int类型的数,有的人会采用INT_MAX,即0x7fffffff作为无穷大。但是以INT_MAX为无穷大常常面临一个问题,即加一个其他的数会溢出。而这种情况在动态规划,或者其他一些递推的算法中常常出现,很有可能导致算法出问题。所以在算法竞赛中,我们常采用0x3f3f3f3f来作为无穷大。0x3f3f3f3f主要有如下好处:0x3f3f3f3f的十进制为1061109567,和INT_MAX一个数量级,即10^9数量级,而一般场合转载 2020-11-11 12:57:14 · 1503 阅读 · 0 评论 -
动态规划解决回文串问题
有关回文串的问题可以用很多种算法来解决,比如:专门为解决回文串而设计的算法Manacher 算法 ,马拉车算法等等,可以看这里 这里只关心用动态规划的方法来解决。文章涉及到 求最长回文子串 leetcode 5最长回文子序列 leetcode 516最少分割次数使得都为回文子串 leetcode 132最少插入次数使得为回文子串 leetcode 1312对待回文串问题的动态规划状态定义,一般有两个一维数组 dp[i] 表示s[0…i]要形成回文子串的最少分割次数(这个定义还是比较少用的)原创 2020-12-17 16:38:02 · 1147 阅读 · 0 评论 -
c++中static关键字 —— leetcode264
关于static关键字的介绍可以看介绍1 介绍2今天想说的是leetcode264,一个使用静态变量大幅提升运算效率的应用这一题暴力的解法就是将所有可能的丑数都列出来,然后排序,找到第n个丑数。代码如下:class Solution {public: int nthUglyNumber(int n) { vector<int> nums; if( nums.empty() ){ //因为题目中给了n 不超过1690,所以这里大于是2^31次方这个原创 2020-12-16 18:40:57 · 254 阅读 · 0 评论 -
leetcode常用函数
1. 求容器内所有元素之和使用numeric中的accumulate函数进行求和。#include <numeric>accumulate(v.begin(), v.end(), 0);accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值。如可以使用accumulate把string型的vector容器中的元素连接起来:string sum = accumulate(v.begin() , v.end() , string(" "));原创 2020-12-10 16:18:07 · 843 阅读 · 0 评论 -
在链表上使用归并排序法(自顶向下的递归和自底向上的迭代两种方法)
转载:leetcode 148题目 官方题解链表的一些辅助函数struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x), next(next) {}};ListNode* crea转载 2020-11-22 22:01:11 · 388 阅读 · 0 评论 -
leetcode98验证二叉搜索树
我信心满满的写下这个代码。结果,测试用例[10,5,15,null,null,6,20]教我做人。。。可见二叉搜索树的递归中,子树是二叉搜索树,拼在一起就不一定是二叉搜索树了class Solution {public: bool isValidBST(TreeNode* root) { if( !root ) return true; if( root->left ){ if( root->left->val &g原创 2020-11-06 16:54:31 · 138 阅读 · 0 评论 -
由leetcode198来思考动态规划
这是一道easy的题目,但是今天我重做的时候,用了一个不一样的方法,对动态规划的理解又深刻了一点。。。主要是将其和背包问题的状态定义的区别更加理解了。之前我对动态规划的理解,就是从最小的一个问题,递推,最终得到最大问题的解。具体我又给其分成两种问题,一种是问题图形画出来是一棵二叉树,一种画出来是多叉树。二叉树问题诸如:斐波那契数列以及其变种(如爬楼梯 / 在一个网格中只能向两个方向移动,让求其最小路径)如这一道问题:其画出来的就是这样的一棵二叉树可以找到其递归结构:状态定义:设 F(n.原创 2020-10-23 20:07:46 · 182 阅读 · 0 评论 -
leetcode 337 打家劫舍 III
这道题真的一开始我想的是树的层次遍历,然后隔行相加,然后再取这二者的最大值。。。但是如果碰到这个测试用例 [4,1,null,2,null,3],取第1行和第4行的结果为7,而各行求和最大结果才为6所以就参考了一下leetcode的官方讲解//递归的方法class Solution {private: unordered_map <TreeNode*, int> f, g; //f表示结点选中情况在该点的最大值 g表示结点不选中情况在该点的最大值 vo.原创 2020-10-19 19:21:44 · 135 阅读 · 0 评论 -
leetcode第211场周赛
???? 这次只做出来一题。。。第三题调了好久,刚开始就想着用multimap来存键值对,结果忘记了multimap的排序是不稳定的。。。哎,后来用系统的排序算法,其底层是用快排写的,也是不稳定的。。。哎,耽误好久class Solution {private: int res = -1;public: int maxLengthBetweenEqualCharacters(string s) { int n = s.size();原创 2020-10-18 14:46:52 · 148 阅读 · 1 评论 -
leetcode第37场双周赛
又是只做出来两道选手。。。第一名26分钟就四道都AC完了 ????class Solution {public: double trimMean(vector<int>& arr) { vector<int> result; sort(arr.begin(), arr.end()); int length = arr.size(); int start = le原创 2020-10-18 10:18:46 · 153 阅读 · 0 评论 -
leetcode47 全排列(去重问题)
这道题相对于leetcode46多了一个去重操作。在代码上也就是在往保存的vector里push进元素的时候多了这么一行判断 if (vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1])) { continue; }即当vis[i] = 0时,有两种情况:1。后面的不成立,即没有被访问过的时候,会先访问它2。这种情况就是在回溯到底的时候,即栈中.原创 2020-10-08 00:13:07 · 164 阅读 · 0 评论 -
leetcode第209场周赛
这也是我的第一场周赛。。。 好烦啊,自己连二叉树基本操作都忘了,只暴力的A了一题。调程序的时候,实验室还有人一直BBB,真烦。先把A的第一题代码放上class Solution {public: int specialArray(vector<int>& nums) { int len = nums.size(); int i = 0; while( i <= len ){ int count原创 2020-10-04 11:53:39 · 203 阅读 · 0 评论 -
leetcode 215 ---- 快速排序
//用快速排序来写的 这里一定要明确每个变量的定义,不然很容易出错class Solution {public: int findKthLargest(vector<int>& nums, int k) { return findKthLargest(nums, 0, nums.size() - 1, k); } //在[l,r]之间寻找第k大个元素private: int findKthLargest( vector<.原创 2020-09-25 15:43:36 · 291 阅读 · 0 评论 -
leetcode六月每日一题 leetcode14
暴力解法~class Solution {public: string longestCommonPrefix(vector<string>& strs) { if(strs.empty()) return ""; string res=""; for(int i=0;i<strs[0].size();i++){ for(int j=1;j<strs.size();j++){ .原创 2020-06-15 19:42:57 · 165 阅读 · 0 评论 -
leetcode六月每日一题 leetcode1300(二分查找法)
class Solution {public: int findBestValue(vector<int>& arr, int target) { sort(arr.begin(), arr.end()); //排序 vector<int> presum(arr.size() + 1); //初始每个元素为0 for (int i = 1; i <= arr.size(); i ++) presum[i] = .原创 2020-06-14 23:12:36 · 197 阅读 · 0 评论 -
leetcode六月每日一题 leetcode15(双指针)
class Solution { //要去掉重复的三元组public: vector<vector<int>> threeSum(vector<int>& nums) { int target; vector<vector<int>> ans; sort( nums.begin(),nums.end() ); //将所给的数据排序 for.原创 2020-06-12 15:39:34 · 157 阅读 · 0 评论 -
leetcode六月每日一题 leetcode739(单调栈)
这个题目我读了半天才读懂。。。题目是这个意思,给出一个每一天的温度列表,然后让你输出还有多少天才能达到比今天温度高如在第一天的73度,只需要一天,即第2天温度就是74度,比它高了.所以输出为1如在第3天的75度,就需要再过4天,到第7天的76度,温度才比75度高。所以输出为4这道题维护一个从栈底到栈顶单调递减的栈。栈中存的是数组的下标。当栈为空的时候,或者要 入栈元素i小于或等于栈顶元素j 时,入栈。 当要入栈元素大于栈顶元素时,将栈顶元素弹出,并将答案数组中对应的天数赋值为 i - jclas.原创 2020-06-11 12:15:48 · 197 阅读 · 0 评论 -
leetcode六月每日一题 面试题46
拿到这道题,首先想到的就是动态规划。即当前的这个数字可以自己翻译,也可以和前一个数字一起翻译。和青蛙跳台阶是一个道理的class Solution {public: int translateNum(int num) { string str = to_string(num); if(str.length() == 1) return 1; int ans[str.length()]; ans[0] = 1; if( (str[0] - .原创 2020-06-09 16:43:43 · 122 阅读 · 0 评论 -
leetcode六月每日一题 leetcode 990
这一题利用并查集(可以高效的回答连接类的问题)来解决首先遍历所有的等式,构造并查集。同一个等式中的两个变量属于同一个连通分量,因此将两个变量进行合并。然后遍历所有的不等式。同一个不等式中的两个变量不能属于同一个连通分量,因此对两个变量分别查找其所在的连通分量,如果两个变量在同一个连通分量中,则产生矛盾,返回 false。如果遍历完所有的不等式没有发现矛盾,则返回 true。class UnionFind{private: vector<int> save;public:.原创 2020-06-08 14:59:05 · 120 阅读 · 0 评论 -
leetcode六月每日一题 leetcode126
class Solution {public: vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) { int end = find(wordList.begin(), wordList.end(), endWord) - wordList.begin(); if(end == w.原创 2020-06-07 23:36:35 · 133 阅读 · 0 评论 -
leetcode六月每日一题 leetcode 238
这道题看提示说不要用除法,我心里一想,为啥会用到除法?原来可以将所有数组里的元素全都乘起来,然后除去每个遍历的元素。。。但是此法禁止用啊~看了一下,用左右乘积这个方法来求很巧妙。具体就是设置一个left用来保存当前扫描到元素左边所有元素的乘积,用right来保存当前扫描到元素右边所有元素的乘积。 然后一个循环之后,也就是经历了一个交叉后,将左右元素乘积都乘一起了 也就求解了~class Solution {public: vector<int> productExceptSel.原创 2020-06-04 23:26:09 · 398 阅读 · 0 评论 -
leetcode五月每日一题 leetcode101
class Solution {public: bool isSymmetric(TreeNode* root) { return ismirror(root,root); } bool ismirror(TreeNode* p,TreeNode* q){ if(!p&&!q)//都为NULL return true; if(!p||!q)//有一个为NULL .原创 2020-05-31 21:32:40 · 135 阅读 · 0 评论 -
leetcode五月每日一题 leetcode84
这道题如果用暴力解法的话,枚举每一个矩形,然后来计算其面积。但是会报超时错误????然后参考了一下;leetcode的官方题解class Solution {public: int largestRectangleArea(vector<int>& heights) { int n = heights.size(); vector<int> left(n), right(n); stack<原创 2020-05-30 22:49:18 · 162 阅读 · 0 评论 -
leetcode五月每日一题 leetcode 198
哎呦,今天的每日一题之前已经做过了。正好给我节约时间准备明天的答辩????,不过作为动态规划不是很熟练的同学,这道题归为简单题也有一点点难吧class Solution {public: int rob(vector<int>& nums) { int n = nums.size(); if( n == 0 ) return 0; vector<int> memo(n ,-1); memo[n-1]原创 2020-05-29 23:25:19 · 211 阅读 · 0 评论 -
leetcode五月每日一题 leetcode394
注意:1.3[a]2[bc] 3[a2[c]] 这两个测试用例不好平衡,如果不是按string弹入栈而是用char的话,这两个用例就会很乱2.当前面的数字超过10的时候,需要times = 10*times + s[i] - '0'; 先乘以10一下class Solution {public: string decodeString(string s) { stack<int> num; stack<string> str;..原创 2020-05-28 14:33:53 · 153 阅读 · 0 评论 -
leetcode五月每日一题 leetcode974
class Solution {public: int subarraysDivByK(vector<int>& A, int K) { unordered_map<int, int> record = {{0, 1}}; int sum = 0, ans = 0; for (int elem: A) { sum += elem; // 注意 C++ 取模的特殊性,当被.原创 2020-05-27 23:21:17 · 205 阅读 · 0 评论 -
leetcode五月每日一题 leetcode287(Floyd 判圈算法)
class Solution {public: int findDuplicate(vector<int>& nums) { int res = 0; for (int fast = 0; res != fast || fast == 0;){ res = nums[res]; fast = nums[nums[fast]]; } cout << res; for (int i = 0; re.原创 2020-05-26 23:32:41 · 283 阅读 · 0 评论 -
Leetcode五月每日一题 Leetcode146
设计类的题一直是我的痛点。。。参考了一下labuladong的题解class LRUCache {private: int cap; // 双链表:装着 (key, value) 元组 list<pair<int, int>> cache; // 哈希表:key 映射到 (key, value) 在 cache 中的位置 unordered_map<int, list<pair<int, int>>::it.原创 2020-05-25 22:31:39 · 137 阅读 · 0 评论 -
leetcode每日一题 leetcode4
这道题自己首先想到的就是利用归并排序的感觉,用两个指针分别扫描两个数组,查找中间元素自己写的代码竟然超时了。。class Solution {public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { bool whetherodd = true; bool iorj = true; //true表示最后一次移动为i.原创 2020-05-24 22:27:43 · 198 阅读 · 0 评论 -
leetcode 五月每日一题 leetcode 76
这道题也是跟子串有关的问题。子串子数组问题出题频率很高啊。拿到这道题,首先想到的就是用暴力破解,将字符串t放入map中,然后列出所有s的子串,查找出长度最小的那一个子串,但是会报超时错误????这道题是用滑动窗口来做的由于t中可能有重复字符,所以用一个查找表map记下t中出现过的字符和其出现的次数然后用i和j来维持一个滑动窗口,每次j往前移动,找到一个查找表中的元素时,将其查找表中的该元素出现的次数减1,并且记录下找到的元素个数,当找到的元素个数等于t的长度的时候,就是找到了一个包含t中所有元素的子串原创 2020-05-23 13:27:36 · 170 阅读 · 0 评论 -
leetcode五月每日一题 leetcode105
class Solution {private: TreeNode* pre_order(int leftpre, int rightpre, int leftin, int rightin, vector<int>& pre, vector<int>& in ){ if(leftpre > rightpre || leftin > rightin ) return NULL; TreeNode* root.原创 2020-05-22 08:06:25 · 193 阅读 · 0 评论 -
leetcode五月每日一题 leetcode5
使用的是中心扩散法。如当abeba是回文字符串的时候,去掉两边的a,beb也是回文字符串当abc不是回文字符串的时候,两边都加上一样的字母eabce也不是回文字符串另外这里要区分字符串为奇数和偶数的情况奇数:中心点是什么元素不用管偶数:中心点两个元素要相同所以这里扫描一遍字符串,对每一个字符都进行一次中心扩散法,来找到最长字串class Solution {private: int substringlen(int l , int r , string s){ .原创 2020-05-21 09:45:47 · 211 阅读 · 0 评论 -
leetcode五月每日一题 leetcode1371
做了好几道不同条件下找子字符串的题了。回文字串 用双指针来解决字串和为k的 用prefix_sum字串乘积最大/字串和最大 用动态规划方法这道题数据规模比较大,所以如果用时间复杂度为O(n^2)的算法比如暴力破解则肯定会报超时错误????这个思路还是参考了B站的花花酱class Solution {public: int findTheLongestSubstring(string s) { //ebaae const char vowels[]原创 2020-05-20 23:44:05 · 152 阅读 · 0 评论 -
leetcode五月每日一题 leetcode680
验证是否为回文串,一般思考的思路就是用双指针的方法。这个还要删除一个元素,就要判断,当左边的i和右边的i不同的时候,[i,j-1] 或 [i+1,j]是否为回文串即可。class Solution {public: bool palindrome(const std::string& s, int i, int j) { for ( ; i < j && s[i] == s[j]; ++i, --j); return i ..原创 2020-05-19 23:49:43 · 219 阅读 · 0 评论 -
leetcode五月每日一题 leetcode152
又是动态规划的题哦。这道题与最大子数组和的区别在于,两个负数乘积会为正。所以就会想:想要正值的时候要最大的正值,想要负值的时候取最小的负值我康的一个比较好的讲解在这里class Solution {public: int maxProduct(vector<int>& nums) { int n = nums.size(); if(!n) return 0; int ans = nums[0]; int.原创 2020-05-18 22:48:41 · 180 阅读 · 0 评论 -
leetcode五月每日一题 leetcode210
官方的提示给了很多啊,先根据给定数组建立有向图,然后通过DFS来检验图中是否有环class Solution {private: bool dfs(int cur, vector<vector<int>>& graph, vector<int>& state, vector<int>& ans){ if(state[cur] == 1) return true; //有环 if(sta.原创 2020-05-17 13:08:05 · 144 阅读 · 0 评论 -
leetcode五月每日一题 leetcode 25
反转链表核心思想:在循环中每次只让这个元素插入到链表的头部class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { //设置一个僵尸2节点就是方便一点 ListNode* dummy = new ListNode(0); //prev永远指的是每一部分的前一个节点 即上链连接下链的那个节点 ListNode* prev = dummy; ..原创 2020-05-16 01:11:10 · 138 阅读 · 0 评论 -
leetcode五月每日一题 leetcode560
这一题刚开始想的就是暴力解法,但是由于题目中给的数据量过大,如果用暴力解法的话,就是O(n^3)的时间复杂度,肯定超出了时间限制在暴力解法中充斥着很多的重复计算,所以我们可以进一步想到用cur数组,来记录从nums[0]到nums[i]的sum和即cur[i] 记录的是nums[0] + nums[1] + ... +nums[i]的和然后按照暴力解法,遍历每一个子数组,看看是否存在cur[j] - cur[i] == k,存在则在最后返回的res上加一但是不幸的是这个方法也是会时间超时,代码先.原创 2020-05-15 01:31:39 · 354 阅读 · 0 评论