- 博客(29)
- 收藏
- 关注
原创 LeetCode - 第37场双周赛
Rank这次的 C、D 都有难度,比赛时没有好的思路.A. 删除某些元素后的数组均值简单模拟.class Solution {public: double trimMean(vector<int>& arr) { int n=arr.size(); sort(arr.begin(),arr.end()); double ans=0; int sz=n/20; for(int i=sz;i+
2020-11-28 23:37:26
170
原创 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
163
原创 LeetCode - 第210场周赛
Rank挺简单的第三题被卡了,结果第四题没时间写,难受…A. 括号的最大嵌套深度括号匹配,简单模拟.class Solution {public: int maxDepth(string s) { stack<char> st; int ans=0; for(char ch:s){ if(ch=='('){ st.push(ch); ans=
2020-10-11 16:12:10
197
原创 LeetCode - 第209场周赛
国庆放假,赛后补题.A. 特殊数组的特征值简单模拟.class Solution {public: int specialArray(vector<int>& nums) { sort(nums.begin(),nums.end()); int n=nums.size(); for(int i=0;i<=n;++i){ int j=0; while(j<n &
2020-10-11 16:11:14
137
原创 浅谈格雷编码
1. 格雷码的定义格雷码是一个二进制数系,其中两个相邻数的二进制位只有一位不同. 3 位二进制数的格雷码序列为 000,001,011,010,110,111,101,100,(可以看成一个环,第一个格雷码 000 与最后一个格雷码 001 也只有一位不同).规定序列的下标以 0 为起点,即 G(0)=000,G(7)=100G(0)=000,G(7)=100G(0)=000,G(7)=100.2. 构造格雷码通过观察找规律,可以得到以下两种手动构造格雷码的方法.2.1 交替构造从全 0 格雷码
2020-10-11 16:09:27
6737
1
原创 LeetCode - 第36场双周赛
国庆放假,赛后补题.A. 设计停车系统简单模拟.class ParkingSystem {public: int b,m,s; ParkingSystem(int big, int medium, int small) { b=big; m=medium; s=small; } bool addCar(int carType) { if(carType==1){ if(b){
2020-10-11 16:08:16
98
原创 LeetCode - 第208场周赛
Rank国庆节补课,赛后补题,这周题比较简单.A. 文件夹操作日志搜集器简单模拟.class Solution {public: int minOperations(vector<string>& logs) { int n=logs.size(); int ans=0; for(string log:logs){ if(log=="./") continue; if(lo
2020-09-27 16:11:16
101
原创 LeetCode - 第207场周赛
Rank又翻车了…A. 重新排列单词间的空格模拟.class Solution {public: string reorderSpaces(string text) { int len=text.size(); int cnt_word=0,cnt_blank=0; vector<string> words; for(int i=0;i<len;){ if(text[i]==' ')
2020-09-21 11:09:08
137
原创 LeetCode - 第35场双周赛
RankA. 所有奇数长度子数组的和暴力求解.class Solution {public: int sumOddLengthSubarrays(vector<int>& arr) { int n=arr.size(),ans=0; for(int i=0;i<n;++i){ for(int j=i;j<n;++j){ if((j-i+1)&1){
2020-09-20 00:21:02
156
原创 LCCUP - 2020秋季全国编程大赛(个人赛)
RankA. 速算机器人简单模拟.class Solution {public: int calculate(string s) { int x=1,y=0; for(char ch:s){ if(ch=='A'){ x=x*2+y; } else{ y=y*2+x; } }
2020-09-18 11:01:17
1178
原创 LeetCode - 第206场周赛
RankA. 二进制矩阵中的特殊位置暴力求解.class Solution {public: int numSpecial(vector<vector<int>>& mat) { int n=mat.size(); int m=mat[0].size(); int ans=0; for(int i=0;i<n;++i){ for(int j=0;j<m;++j
2020-09-14 23:06:30
121
原创 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
113
原创 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
113
原创 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
108
原创 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
105
原创 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
86
原创 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
102
原创 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
81
原创 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
94
原创 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
103
原创 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
原创 浅谈Manacher算法
1. 前言给定一个长度为 nnn 的字符串 S,Manacher 算法可以在 O(n)O(n)O(n) 的时间内计算出分别以 S 中的每个字符为中心,最大回文子串的长度. 通常 Manacher 算法可以用来求解一个字符串中的最长回文子串,或者是统计一个字符串中所有回文子串的个数等.2. 字符串预处理首先需要对带求解的字符串 S 填充分隔符,在每个字符的两边都插入一个特殊的符号,这里我们取 # 作为分隔符,比如 ABCD 填充之后变成了 #A#B#C#D#;再比如 ABC 填充之后变成了 #A#B#C
2020-08-20 12:09:56
183
原创 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
209
原创 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
原创 LeetCode 2 - 两数相加
模拟手动模拟加法的过程,用一个变量 flag 作为进位标志,从左向右同时遍历两个链表,将对应位置上的数相加得到当前位的结果,同时更新进位标志 flag,继续完成后续计算.需要注意的是两个链表长度不相等的情况,以及如果在计算完毕时 flag=1,那么还需要在结果链表尾部附加一个新结点表示进位得到的最高位的 1·/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *n.
2020-08-05 16:42:37
77
原创 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
137
原创 浅谈摩尔投票算法
1. 前言摩尔投票算法可以在线性时间复杂度 O(n)O(n)O(n) 和常数空间复杂度 O(1)O(1)O(1) 的前提下找出一组数据中的多数元素,多数元素的定义是:假设一共有 nnn 个数,那么多数元素就是出现次数严格大于 ⌊n2⌋\lfloor \frac{n}{2} \rfloor⌊2n⌋ 的数.2. 分治思想以 LeetCode169-多数元素 为例,要找出一个数组中的多数元素,可以采用分治思想.在这道题目中,明确了给定的数组一定存在多数元素,那么根据多数元素的定义可知,多数元素有且只有
2020-08-02 22:51:07
838
原创 浅谈表达式求值问题
1. 前言经常会遇到这样一种类型的编程题目,给定一个合法算术运算式字符串(本文不考虑非法情况的判断和处理),求出它的计算结果,通常字符串中包含了 +-×/ 四则运算、改变运算优先级的括号 () 以及整数数字.例如,要求程序输入 2×5+6×(3+2)2×5+6×(3+2)2×5+6×(3+2) 这样一个字符串,输出其正确的计算结果也就是 404040 .2. 表达式表示法表示方法有 3 种,分别是前缀表达式(波兰表达式)、中缀表达式、后缀表达式(逆波兰表达式),以之前的例子 2×5+6×(3+2)
2020-07-24 20:49:32
1064
原创 浅谈KMP算法
前言KMP算法用于解决字符串匹配问题,现有两个字符串 S 和 P,请求出字符串 P 在字符串 S 中首次出现的位置,通常 S 被称为文本串,P 被称为模式串. 我们规定字符串的下标从 0 开始,文本串 S 的长度为 nnn,模式串 P 的长度为 mmm. 在下面这个例子中,模式串 P 在 S 中首次出现的位置是 3.暴力匹配解决这个问题最直接的方法就是用模式串 P 的开头依次与文本串 S 中的每一个下标对齐,然后判断 S 和 P 的后续字符是否完全相等. 在最差的情况下,算法的复杂度是 O(nm)O
2020-07-21 18:16:03
723
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人