
LeetCode算法题解
文章平均质量分 68
学习算法
Baal Austin
愿温柔待以岁月,愿孤独忘之流年
展开
-
80. 删除有序数组中的重复项 II
Problem: 80. 删除有序数组中的重复项 II文章目录方法一思路Code方法二思路Code方法一思路快慢指针,slow代表符合条件的值存储位置,fast代表遍历列表当前值的位置,假设将fast位置的值存储到slow位置,必须满足slow位置的值与前两个值不相同才能存储,不符合遍历fast下一个位置的值,slow位置不变Codeclass Solution: def removeDuplicates(self, nums: List[int]) -> int:原创 2024-06-02 15:14:49 · 232 阅读 · 0 评论 -
LeetCode9 回文数
原题目代码分析转换为字符串,翻转比较class Solution {public: bool isPalindrome(int x) { string s1 = to_string(x); string s2(s1.rbegin(),s1.rend()); return s1==s2; }};直接将数字翻转比较class Solution {public: bool isPalindrome(int x) {原创 2020-07-29 22:38:02 · 144 阅读 · 0 评论 -
LeetCode131/132 分割回文串I/II
代码分析题目一暴力法递归递归分割所有情况,判断分割部分是否是回文串,如果分割部分是回文串,继续分割后面的字符串,直到能全部分割为止,为一种分割情况class Solution {public: vector<vector<string>>res; bool isIsPalindrome(string &s, int left, int right){//判断是否是回文 while(left<right&&s[le原创 2020-07-29 15:12:20 · 213 阅读 · 0 评论 -
LeetCode69 x的平方根
原题目代码分析sqrt()函数class Solution {public: int mySqrt(int x) { return sqrt(x); }};暴力法/*即找小于x的最大整数乘积当i*i<=x&&(i+1)*(i+1)>x即为答案*/class Solution {public: int mySqrt(int x) { for(int i = 1; i < x; i++){原创 2020-07-29 10:51:39 · 129 阅读 · 0 评论 -
LeetCode68 左右文本对齐
原题目代码分析1.先要确定一行能添加的最大单词数,即一行单词长度总和+两个单词之间有一个空格的总个数要达到<=maxWidth的最大值2.确定了一行单词的开头和结尾,接下来就是对一行单词格式进行处理,也就是还需对无效空格的处理(1)只有一个单词的情况:左对齐,直接将无效空格添加到末尾(2)最后一行的情况:左对齐,在两单词之间添加一个有效空格,最后一个单词后添加所有无效空格(3)中间行的情况:平均无效空格,无法平均的多余无效空格从前往后多分一个,直至没有,所以每两个单词之间添加1个有效空格原创 2020-07-28 22:45:48 · 170 阅读 · 0 评论 -
LeetCode30 串联所有单词的子串
原题目代码分析方法一:暴力法图片来源点击此处i从0开始遍历,在所有单词总长范围内,判断是否符合要求,符合要求添加当前i下标i移向下一个,继续判断要找到满足所有words数组单词的子串1.先统计words每个单词的个数2.从i开始遍历,截取单个单词长度的字符串,如果该字符串比 words的该单词个数小,则i移向下一个单词的首地址,否则停止,如果能遍历到words所有单词总长度结尾,即符合条件class Solution {public: vector<int> fi原创 2020-07-28 13:02:26 · 164 阅读 · 0 评论 -
LeetCode32 最长有效括号
原题目代码分析方法一:栈1可以将能匹配的左右括号设为1,不能匹配设为0,找连续匹配的括号即可,即连续的1class Solution {public: int longestValidParentheses(string s) { stack<int>st;//存储左括号下标 vector<int>vec(s.size(),0);//将不能匹配的括号置为0,能匹配的置为1 for(int i = 0; i <原创 2020-07-27 12:29:37 · 145 阅读 · 0 评论 -
LeetCode214 最短回文串
原题目代码分析题目可理解为找最长回文前缀,将不满足的部分翻转添加在首部即可如:例1:aacecaaa回文前缀为aacecaa 剩余a为使其构成回文添加a形成aaacecaaa例2:abcd最长前缀为a,剩余bcd为使其构成回文添加dcb形成dcbabcd难点:最长回文前缀怎么找方法一:暴力法先翻转原字符串,找最长前缀回文串,就是找原字符串的前缀和翻转字符串的后缀能匹配的最大长度例1:原 aacecaa a翻转 a aacecaa翻转字符串前剩余的添加到源字符串前面形成aa原创 2020-07-26 15:01:12 · 321 阅读 · 0 评论 -
LeetCode151翻转字符串里的单词
代码分析原地翻转方法一三步走: 1.删除空格 1)前空格 2)中间空格(此题难点) 3)后空格 2.翻转单个单词 1)找到单词首字母和尾字母,确定范围,翻转单词 3.翻转整个字符串要求:空间复杂度为O(1),只能在原字符串上修改void swap(char *s,int left, int right){//翻转left~right的字符串 while(left<right){//交换字符 s[left] ^=s[right]原创 2020-07-23 11:57:30 · 126 阅读 · 0 评论 -
LeetCode65 有效数字
原题目验证给定的字符串是否可以解释为十进制数字。例如:“0” => true" 0.1 " => true“abc” => false“1 a” => false“2e10” => true" -90e3 " => true" 1e" => false“e3” => false" 6e-1" => true" 99...原创 2020-07-21 19:43:52 · 215 阅读 · 0 评论 -
LeetCode273 整数转换英文表示
原题目代码分析分治难点一: 如何确定当前数字的位数 位数:个,十,百,千,百万,亿 有单位的 “Hundred”,“Thousand”,“Million”,“Billion” 1.分两类:有单位和无单位 1)无单位分为=0, <20, <100 =0返回""; <20用数组存储1~20的英文单词,返回该数字的英文 <100用数组存储20-90整十的英文,返回十位的英文+个位的英文 2)有单位分为<1000,<100原创 2020-07-21 10:50:51 · 149 阅读 · 0 评论 -
LeetCode76最小覆盖子串
原题目代码分析滑动窗口双指针1.右指针从0开始遍历,当包含全部t字符时,缩减左指针,直到使包含t的子串最短,如果比上一次的res短传给res2.继续重复以上操作,直到右指针遍历完条件包含t所有字符的条件:t所有字符都找到,即长度为len_t的字符t,最后len_t=0如何减少len_t,即算作一次找到t的一个字符首先s当前位置的字符t中存在,并且s当前字符数不能超过t的该字符数如何找最短子串,在len_t==0的情况下,即右边界确定的情况下,如何遍历左指针确定左边界,使最短即出现第原创 2020-07-19 23:03:43 · 104 阅读 · 0 评论 -
LeetCode168 Excel列表名称(进制转换)
原题目代码分析进制转换十进制->二十六进制原始 : 0~26->A ~ZXn * 26^n+…+ X2 * 26^2+ X1* 26^1 +x0 * 26^0 = num例: 1 * 26^2+3 * 26^1 +10 * 26^0 = 764转换为26进制,即和前面的系数形成映射1->B3->D10->K转26进制:BDK代码实现方式方程两边同时取余26,余数即为低位的系数(1 * 26^2+3 * 26^1 +10 * 26^0)%26 =原创 2020-07-17 11:12:10 · 183 阅读 · 0 评论 -
LeetCode336 回文对
代码分析四种情况:1.数组里有空字符串,并且数组里还有自己就是回文的字符串,每出现一个2.可与空字符串组成两对。2.如果自己的翻转后的字符串也在数组里,可以组成一对,注意翻转后不能是自己。3.如果某个字符串能找到一个分割点,分割点前的部分是回文,后半部分翻转后也在数组里,可组成一对。4.把3反过来,如果后部分是回文,前半部分翻转后在数组里,可组成一对。class Solution {public: bool isPalindrome(string &s, int start,原创 2020-07-17 10:10:54 · 125 阅读 · 0 评论 -
LeetCode125 验证回文串
原题目代码分析原数组比较注意:不区分大小写,所以比较时统一转换为大写或小写在比较,其他非数字字母字符跳过class Solution {public: char op(char ch)//转小写 { if(ch>='A'&&ch<='Z') return ch+32; else return ch; } bool isPalindrome(string s原创 2020-07-16 22:16:56 · 131 阅读 · 0 评论 -
LeetCode87 扰乱字符串
原题目给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。下图是字符串 s1 = “great” 的一种可能的表示形式。great/ \gr eat/ \ / \g r e at / \ a t 在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。例如,如果我们挑选非叶节点 “gr” ,交换它的两个子节点,将会产生扰乱字符串 “rgeat” 。rgeat/原创 2020-07-16 15:10:29 · 116 阅读 · 0 评论 -
LeetCode316 去除重复字母(贪心)
原题目题目分析栈class Solution {public: string smallestSubsequence(string text) { int count[26]={0};//每个字母出现次数 int used[26]={0};//判断是否使用 for(auto c : text){//统计 count[c-'a']++; } string res; for(原创 2020-07-15 15:16:44 · 303 阅读 · 0 评论 -
LeetCode28 实现strStr()(找到子串第一次出现的位置BF,KMP)
原题目代码分析使用c语言strstrchar *ch = strstr(haystack, needle) 得到当前位置int strStr(char * haystack, char * needle){ char * res = strstr(haystack, needle); return res!=NULL ? res-haystack : -1;}使用C++findint index = haystack.find(needle) 得到当前位置class So原创 2020-07-12 09:07:03 · 276 阅读 · 0 评论 -
LeetCode58 最后一个单词的长度
原题目代码分析1.tringstream使用class Solution {public: int lengthOfLastWord(string s) { stringstream stream(s); int len = 0; string word; while(stream >> word){ len = word.size(); } return l原创 2020-07-10 13:31:14 · 112 阅读 · 0 评论 -
LeetCode14 最长公共前缀
原题目代码分析1.按列比较class Solution {public: string longestCommonPrefix(vector<string>& strs) { string s; if(strs.size()==0)return s; for(int i = 0; i < strs[0].size(); i++){{//以第一个字符串作为最大长度,遍历字符 for(int j原创 2020-07-10 12:40:33 · 129 阅读 · 0 评论 -
LeetCode290 单词规律
原题目代码分析c++stl(map, set, stringstream)map: 用于存储字母和单词之间的映射关系set: 用于存储出现过的单词stringstream: 用于分割单词错误条件:1.单词比字母多2.字母比单词多3.一个字母对应多个单词4.一个单词对应多个字母class Solution {public: bool wordPattern(string pattern, string str) { stringstream stream(st原创 2020-07-10 11:26:57 · 157 阅读 · 0 评论 -
LeetCode301 删除无效括号
原题目代码分析1.dfs情况分析:(1)当前为左括号:删除左括号:左括号删除个数-1,其余不变,继续递归下一位置保留左括号:栈数+1,其余不变,继续递归下一位置(2)当前为右括号:删除右括号:右括号删除个数-1,其余不变,继续递归下一位置保留右括号:栈数-1,其余不变,继续递归下一位置(3)当前为其他字符:直接保存当前字符,其余不变,继续递归下一位置终止条件:当左括号和右括号要删除的个数都为零且字符串遍历到最后说明符合条件,放入结果数组中如果左括号或右括号要删除的个数小于0(原创 2020-07-09 12:14:33 · 275 阅读 · 0 评论 -
LeetCode115 不同的子序列
代码分析1.记忆化搜索递归:(1)使用当前字符,当两者相等时(2)不使用当前字符结束条件:t到达末尾返回1t未到达而s到达末尾返回0记忆数组:以s和t的下标为数组下标,保存以此往后满足条件的个数class Solution {public: int dfs(string &s, int index_s, string &t, int index_t, vector<vector<int>>&v){ if(s.siz原创 2020-07-09 11:51:06 · 143 阅读 · 0 评论 -
LeetCode205 同构字符串
原题目代码分析1.字符串find的使用遍历字符串,用find函数查找当前字符第一次出现的位置,如果s和t第一次出现该字符的位置相同,这说明对应class Solution {public: bool isIsomorphic(string s, string t) { for(int i = 0; i < s.size(); i++){ if(s.find(s[i])!=t.find(t[i])){ retur原创 2020-07-08 21:53:54 · 131 阅读 · 0 评论 -
LeetCode395 至少有k个重复字符的最长子串
原题目代码分析1.递归分治用哈希表存储数组每个字符出现的次数, 从左往右查找, 以不满足的字符为分界点,找左边符合要求的数组和右边符合要求的数组class Solution {public: int longestSubstring(string s, int k) { if(s.size()<k)return 0;//当数组长小于k,返回0 int hash[26]={0};//存储数组每个字符出现的次数 for(auto c :原创 2020-07-08 19:42:23 · 145 阅读 · 0 评论 -
LeetCode面试题56 - I. 数组中数字出现的次数
原题目点击进入题目解题分析方法一:位运算1.先对所有数进行异或,相同的数被抵消,最后相当于对两个不同的数进行异或2.因为两个数不同,所以异或结果肯定不为0,则找异或后结果的二进制位数为1的地方,说明两个不同的数在二进制情况下,当前位数的值不同3.我们可将原来的数组按照该位数的数值是否为1,分为为1和为0两个数组,从而将两个数分开,再对两个数组分别异或,求出两个数注意:n&...原创 2020-04-28 17:21:34 · 136 阅读 · 0 评论 -
LeetCode51/52 N皇后I/II
LeetCode52N皇后m*m矩阵,每一行有m列,一行也就有m个可能性,dfs从第一行开始放棋子,并检验当前位置和前面的位置是否冲突,因为行是从0遍历到m所以不用考虑行是否冲突,只有考虑列和对角线,列不相等及一维数组的值不相等,对角线不相等则与一维数组前面元素的行与行和列与列的差不相等,满足以上条件递归至下一行,不满足则for循环找满足规则的列坐标,终止条件为递归到第m行class Solu...原创 2019-11-30 13:08:58 · 147 阅读 · 0 评论 -
LeetCode134. 加油站
方法一:暴力法class Solution {public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { int n = gas.size();//长度 for(int i = 0; i < n; i++){ ...原创 2019-11-17 15:03:13 · 166 阅读 · 0 评论 -
LeetCode121. 买卖股票的最佳时机
方法一:int maxProfit(int* prices, int pricesSize){ int profit=0; if(pricesSize==0)return 0; int dp[pricesSize]; dp[pricesSize-1]=0; for(int i=pricesSize-2;i>=0;i--) { ...原创 2019-11-17 12:41:14 · 104 阅读 · 0 评论 -
LeetCode122. 买卖股票的最佳时机 II
方法一:class Solution {public: int maxProfit(vector<int>& prices) { if(prices.size()==0)return 0; int buy,sell; int sum = 0; for(int i = 0; i < prices...原创 2019-11-17 12:23:49 · 88 阅读 · 0 评论 -
LeetCode 45/55. 跳跃游戏I/II
方法:贪心算法假设一步一步走,每次将他从当前位置移动的最大距离原创 2019-11-16 20:11:22 · 109 阅读 · 0 评论 -
LeetCode338. 比特位计数
对于所有的数字,只有两类:奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。举例:0 = 01 = 12 = 103 = 11偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。举例:2 = 104 = ...原创 2019-11-13 00:21:29 · 97 阅读 · 0 评论 -
LeetCode191.位1的个数
方法一:利用2次幂的二进制与2次幂-1的二进制是取反的性质,相与后可每次消去末尾一个1,以此来统计要抹去多少次1使其为0int hammingWeight(uint32_t n) { int ans=0; while(n) { ans++; n&=n-1; } ...原创 2019-11-12 21:11:08 · 95 阅读 · 0 评论 -
LeetCode342.4的幂
方法一:class Solution {public: bool isPowerOfFour(int num) { while(num % 4 == 0 && num != 0){ num /= 4; } return num == 1; }};方法二:位运算class Solu...原创 2019-11-10 14:59:52 · 112 阅读 · 0 评论 -
LeetCode268.缺失的数
方法一:数学高斯求和公式因为包括0,去掉一个数,所以数组的长度就是其最大数的值,求数组值和,和1-n总和相减class Solution {public: int missingNumber(vector<int>& nums) { int sum1 = 0; for(int i = 0; i <nums.size(); i...原创 2019-11-10 11:50:53 · 92 阅读 · 0 评论 -
LeetCode201数字范围按位与
方法一:找前端相同位即在遍历过程中始终不变的位置就是答案从二进制角度看1.如果m,n位数相等,n->m遍历时必定从某一位开始后面的数都从0->1或1->0,只要出现0,按位与后,该位置就始终是0m=9(1001)n=15(1111)9(1001)->10(1010)后三位按位与都是0,前一位不变,所以答案82.如果m,n位数不相等,则按位与后一定为0,因为m...原创 2019-11-09 16:35:29 · 197 阅读 · 0 评论 -
LeetCode187.重复的DNA序列
方法一:滑动窗口+哈希表class Solution {public: vector<string> findRepeatedDnaSequences(string s) { vector<string> ans; map<string,int> mp;//map存储 for(int i = 0; i + 9 < s....原创 2019-11-09 14:06:23 · 142 阅读 · 0 评论 -
LeetCode376 摆动序列
原题目题目分析方法一:直接遍历将数组拆分,把每一部分分成一个单调序列,即单调递增和单调递减交替出现如[1,17,5,10,13,15,10,5,16,8]将其分成1,1717,55,10,13,1515,10,55,1616,8元素的个数=序列个数+1那么如何查找单调序列即定一个最小值和一个最大值,然后遍历找每个序列的最小值和最大值,以此来判断是否满足要求以上例为例...原创 2019-11-09 12:01:07 · 235 阅读 · 1 评论 -
LeetCode190.颠倒二进制位
方法 一:位运算例:假如n为四为数,循环四次,高位为0右移前端补0,为1右移前端补1,左移后端补0n = 1010res = 0000;n = 1101;res =0000;n = 1110;res = 0001;n = 1111;res = 0010;n = 1111;res = 0101;class Solution {public: uint32_t r...原创 2019-11-09 10:36:21 · 184 阅读 · 0 评论 -
LeetCode229.求众数II
方法一:哈希表(不符合题意要求)class Solution {public: vector<int> majorityElement(vector<int>& nums) { map<int,int>mp1,mp2;//mp1记录个元素个数,mp2标记以添加元素 vector<int>res;...原创 2019-11-08 21:37:14 · 124 阅读 · 0 评论