LeetCode算法题解
记录我的 LeetCode 算法之路,主要使用 C++ 语言完成,所有题解代码均已同步至个人 Github,欢迎各位小伙伴star~
【https://github.com/xiaok0707/MyLeetcode】
xiaok0707
这个作者很懒,什么都没留下…
展开
-
LeetCode 15 - 三数之和
排序+双指针首先对整个数组升序排序,便于对结果去重. 朴素算法是暴力枚举数组中的三个位置 (i,j,k),i<j<k,使得 nums[i]+nums[j]+nums[k]=0,复杂度为 O(n3)O(n^3)O(n3).利用双指针算法进行优化,仍然枚举待选取的第一个数 nums[pos],然后在 [pos+1,n-1] 中找到两个下标 (le,ri),le<ri 使得 nums[pos]+nums[le]+nums[ri]=0 即可满足要求,算法流程如下:如果 n<3 或..原创 2020-10-12 11:09:09 · 176 阅读 · 0 评论 -
LeetCode 14 - 最长公共前缀
字典树根据输入字符串,建立字典树,维护最长公共前缀.class Solution {public: struct Trie{ Trie* nxt[26]; int cnt; Trie(int cnt){ for(int i=0;i<26;++i) nxt[i]=NULL; this->cnt=cnt; } }; int n; Trie* roo.原创 2020-08-29 09:16:51 · 116 阅读 · 0 评论 -
LeetCode 13 - 罗马数字转整数
模拟按照题意模拟即可.class Solution {public: string roman[13]={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"}; int number[13]={1,4,5,9,10,40,50,90,100,400,500,900,1000}; int romanToInt(string s) { int ans=0,len=s.length(); .原创 2020-08-28 09:06:01 · 115 阅读 · 0 评论 -
LeetCode 12 - 整数转罗马数字
模拟按照题意模拟即可.class Solution {public: string roman[13]={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"}; int number[13]={1,4,5,9,10,40,50,90,100,400,500,900,1000}; string intToRoman(int num) { string ans=""; int pos=.原创 2020-08-27 23:19:53 · 110 阅读 · 0 评论 -
LeetCode 11 - 盛最多水的容器
双指针很经典的双指针题目,可以初始化 le=0,ri=n-1 让左右指针分别指向最左端和最右端的垂线,然后不断比较 le 和 ri 对应垂线的高度:height[le]<height[ri]:由于 le 的高度更小,因此 le 会决定水面的高度,所以如果选择 (le,ri-1)、(le,ri-2) … 等作为最终答案,盛水量一定小于选择直接将 (le,ri) 作为最终答案的盛水量,因此可以直接忽略这些情况,令 le+1,考虑后续解.height[le]>=height[ri]:由于 r.原创 2020-08-26 22:40:18 · 108 阅读 · 0 评论 -
LeetCode 10 - 正则表达式匹配
DP令 dp[i][j] 表示 s[0...i-1] 和 p[0...j-1] 是否匹配,然后对 dp[i][j] 进行分类讨论:若 p[j-1] 是普通字母,则 p[j-1]=s[i-1] 且 s[0...i-2] 和 p[0...j-2] 匹配即 dp[i-1][j-1]=true 时,dp[i][j]=true.若 p[j-1]='.' ,则无论 s[i-1] 是什么 p[j-1] 都可以与其匹配,所以只需要 dp[i-1][j-1]=true 时,dp[i][j]=true.若 p[j-.原创 2020-08-26 00:26:58 · 87 阅读 · 0 评论 -
LeetCode 9 - 回文数
模拟将整数的每一位转存到一个数组中,然后遍历数组判断是否回文.class Solution {public: bool isPalindrome(int x) { if(x<0) return false; vector<int> v; while(x){ v.push_back(x%10); x/=10; } int len=v.size();.原创 2020-08-24 23:28:17 · 106 阅读 · 0 评论 -
LeetCode 8 - 字符串转换整数 (atoi)
模拟按照题意模拟即可,细节较多.class Solution {public: int myAtoi(string str) { if(str.empty()) return 0; int len=str.length(),pos=0; while(pos<len && str[pos]==' ') pos+=1; if(pos==len) return 0; if(str[pos]=='+.原创 2020-08-23 23:47:09 · 83 阅读 · 0 评论 -
LeetCode 7 - 整数反转
数学直接用 long long 或者转换成字符串处理当然是能通过的,如果机器环境只支持 32 为整数,可以用数学方法判断. 如果不考虑溢出,代码可以这样写:class Solution {public: int reverse(int x) { int ans=0; while(x){ int pop=x%10; x/=10; ans=ans*10+pop; } .原创 2020-08-22 00:16:59 · 97 阅读 · 0 评论 -
LeetCode 6 - Z 字形变换
模拟使用两个变量 row 和 down 来记录当前行号和前进方向,使用 vector 按行存储结果,最后统一输出.class Solution {public: string convert(string s, int numRows) { if(numRows==1) return s; vector<string> v(numRows); int row=0; bool down=true; fo.原创 2020-08-20 20:23:17 · 108 阅读 · 0 评论 -
LeetCode 5 - 最长回文子串
区间DPdp[i][j] 表示子串 s[i...j] 是否是回文串,有如下递推式.dp[i][j]=dp[i+1][j−1] and s[i]=s[j]dp[i][j]=dp[i+1][j-1] \ and \ s[i]=s[j]dp[i][j]=dp[i+1][j−1] and s[i]=s[j]即如果 s[i+1...j-1] 是一个回文串,同时 s[i]==s[j] ,则 s[i...j] 也是一个回文串,初始化所有的 dp[i][i] 和 dp[i.原创 2020-08-20 20:04:32 · 97 阅读 · 0 评论 -
LeetCode 4 - 寻找两个正序数组的中位数
二分+递归如果某个有序数组长度是奇数,那么其中位数就是中间元素;如果长度是偶数,那么中位数就是中间两个数字的平均值.假设两个有序数组的长度分别为 m 和 n,由于两个数组长度之和 m+n 的奇偶不确定,为了简化代码,在混合后的数组找到第 (m+n+1)/2 个元素,和第 (m+n+2)/2 个元素(这里的 / 指的是整除),然后求两者平均值. 若 m+n 为偶数,那么两者平均值刚好是中位数;若 m+n 为奇数,那么 (m+n+1)/2 和 (m+n+2)/2 的值相等,相当于两个相同的数字相加再除以 .原创 2020-08-07 23:20:39 · 214 阅读 · 0 评论 -
LeetCode 3 - 无重复字符的最长子串
滑动窗口用双指针 i,j 维护一个区间,保证让区间 [i,j) 对应的子串没有重复字符,初始化 i=j=0 表示区间为空.令 j 不断向右移动直到区间 [i,j) 出现重复字符或遍历结束.再将 i 向右移动直到区间 [i,j) 不再有重复字符.不断重复上述两个过程直到遍历结束,在过程中使用哈希表统计区间 [i,j) 出现过哪些字符,并更新最终答案.时间复杂度 O(n)O(n)O(n) .class Solution {public: int lengthOfLongestSubs.原创 2020-08-06 23:31:00 · 112 阅读 · 0 评论 -
LeetCode 2 - 两数相加
模拟手动模拟加法的过程,用一个变量 flag 作为进位标志,从左向右同时遍历两个链表,将对应位置上的数相加得到当前位的结果,同时更新进位标志 flag,继续完成后续计算.需要注意的是两个链表长度不相等的情况,以及如果在计算完毕时 flag=1,那么还需要在结果链表尾部附加一个新结点表示进位得到的最高位的 1·/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *n.原创 2020-08-05 16:42:37 · 79 阅读 · 0 评论 -
LeetCode 1 - 两数之和
思路使用一个哈希表记录 mp 每个数字出现的位置,mp[x] 表示数字 x 在原数组中的下标为 mp[x]-1(因为C++哈希表默认值为 0,所以向右偏移 1 位). 从左向右遍历数组,并更新 mp,如果遍历到下标 i ,发现此时 mp[target-nums[i]]>0 ,说明 target-nums[i] 之前就出现过,符合要求,返回结果即可.时间、空间复杂度均为 O(n)O(n)O(n).代码class Solution {public: vector<int> .原创 2020-08-04 22:51:08 · 138 阅读 · 0 评论