题型总结——leetcode 54 螺旋矩阵
54. 螺旋矩阵题目
解法这道题目的解法其实并不是很难,自己最开始写的时候是想着一个循环中只是处理数据,对于下个要添加进去的数据则是需要有很多辅助if去判断,问题就出在这里,正确的、容易理解发解法就是下面这个
代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748vector<int> Array::spiralOrder(vector<vector<int>>& matrix){ int m = matrix.size(); int n = matrix[0].size(); if (m == 0 || n == 0) return {}; vector<int> res; int left = 0, right = n - 1, top = 0, buttom = m - 1; while (left <= right && top <= but ...
题型总结——leetcode 2555 两个线段获得的最多奖品
2555. 两个线段获得的最多奖品题目
解法实际这道题目是动态规划的思想,最开始自己写的思路是找出一个线段的最大值再去在剩下的不重合区间内寻找下一个线段的最大值,但是这种情况下二者的 和 (最终的结果)不一定是最大的,前期的思路准备很重要
代码123456789101112131415161718192021222324252627282930int Array::maximizeWin(vector<int>& prizePositions, int k){ int n = prizePositions.size(); //对解雇是整个数组长度的情况提前进行解决 //使用 k *2 + 1 是考虑到数组长度是偶数的时候,,同时> 的使用也把原本的奇数包括进去 if (k * 2 + 1 >= prizePositions[n - 1] - prizePositions[0]) { return n; } int ans = 0, mx = 0, left = 0, right = 0; ...
题型总结——leetcode 448 找到数组中消失的数字
448. 找到所有数组中消失的数字题目
解法根据题目给出的要求,正确数组应该是所有数字各不相同,即意味着所有所有数据都可以看做是该数组的有效索引+1,
在第一个for循环中处理的就这这个内容,将数据转换为索引并在对应的位置上+n, %n的操作是防止该位置上的值已经被+n过从而导致索引越界。
123456789101112131415161718192021222324vector<int> Array::findDisappearedNumbers(vector<int>& nums){ int n = nums.size(); //索引处理 for (int& x : nums) { int i = (x - 1) % n; nums[i] += n; } //最后的结果是根据索引来处理,那个值没有变动,就代表这个位置的索引+1的数没有出现 vector<int> res; for (int i = 0; i < n; i++) { cout << ...
题型总结——leetcode 414 第三大的数
414. 第三大的数题目
解法三种解法
排序
有序集合
一次遍历
排序非常常规且容易想到的解法,只不过在时间复杂度上不是很友好
123456789int thirdMax(vector<int> &nums) { sort(nums.begin(), nums.end(), greater<>()); for (int i = 1, diff = 1; i < nums.size(); ++i) { if (nums[i] != nums[i - 1] && ++diff == 3) { // 此时 nums[i] 就是第三大的数 return nums[i]; } } return nums[0]; }
有序集合长时间没有使用Set,甚至忘记了有这东西,第一时间先到的是双端队列这种东西,set会对插入的内容进行一个排序处理,beg ...
题型总结——leetcode 119 杨辉三角
119. 杨辉三角 II题目
代码12345678910111213141516vector<int> getRow(int rowIndex) { vector<int> res; //杨辉三角核心代码 for (int i = 0; i <= rowIndex; i++) { res.resize(i + 1, 1); for (int j = i - 1; j > 0; j--) { res[j] += res[j - 1]; } } return res; }
记忆双重for循环中的杨辉三角核心代码
题型总结——leetcode 520 检测大写字母
520. 检测大写字母问题
解法两种解法
自己第一次写的
03XF的
自己的123456789101112131415161718192021222324252627282930if (word.length() == 0 || word.length() == 1) return true; bool flag1 = false; //检查首位是不是大写的 if (toupper(word[0]) == word[0]) { flag1 = true; } //从第二个开始,后面都需要相同 bool flag2 = false, flag3 = false; //flag2是判断大写的,flag3是判断小写的 for (int i = 1; i < word.length(); i++) { flag2 = flag2 || toupper(word[i]) == word[i] ? 1 : 0; flag3 = flag3 || tolower(word[i]) == word[i] ? 1 : 0; } if ...
题型总结——leetcode 459 重复的字符串
459. 重复的子字符串
该问题有有三种解法,第一种就是常见的枚举,双重for循环,时间复杂度通常不如人意,On2
第二种则是巧妙利用这种结构的特性进行处理
第三种是经典的KMP算法
枚举12345678910111213141516171819bool repeatedSubstringPattern(string s) { int n = s.size(); for (int i = 1; i * 2 <= n; ++i) { if (n % i == 0) { bool match = true; for (int j = i; j < n; ++j) { if (s[j] != s[j - i]) { match = false; break; ...
题型总结——leetcode 389 找不同
389. 找不同四种解法求和reduce是在numeric头文件下的对容器进行累计操作的方法,默认是求和
1return (char)reduce(t.begin(), t.end()) - reduce(t.begin(),t.end());
时间复杂度On,空间复杂度O1
排序12345678910111213ranges::sort(s); ranges::sort(t); int n = s.length(); for (int i = 0; i < n; i++) { if (s[i] != t[i]) { return s[i]; } } return t.back();
时间复杂度OnlogN,空间复杂度O1
计数12345678910111213vector<int> cnt(26, 0); for (char ch: s) { cnt[ch - 'a']++; } for (char ch ...
题型总结——leetcode 67 二进制求和
67. 二进制求和1234567891011121314151617181920212223242526string StringTopic::addBinary(string a, string b){ //模拟运算 string res; ranges::reverse(a); ranges::reverse(b); int n = max(a.length(), b.length()), carry = 0; for (int i = 0; i < n; i++) { carry += i < a.length() ? (a[i] == '1') : 0; carry += i < b.length() ? (b[i] == '1') : 0; res.push_back(carry % 2 ? '1' : '0'); carry /= 2; } if (carry) { res.push_back('1') ...
题型总结——leetcode 3174 清除数字
3174. 清除数字这时一道简单的栈处理题目,
下面是一开始和直接使用栈的解决方式
123456789101112131415161718192021222324252627string Array::clearDigits(string s){ stack<char> sta; for (char c : s) { if (isdigit()) { sta.pop(); } else { sta.push(c); } } s = ""; while (!sta.empty()) { s += sta.top(); sta.pop(); } ranges::reverse(s); return s; }
以上方法虽然能解决问题,但是最后还需要对新建的栈进行处理,回顾栈的定义,可以使用以下代码
123456789string st;for (char c : s) { if (isdigit(c)) { ...