![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
文章平均质量分 69
南七行者
相信时间会创造奇迹。
展开
-
Arrays.asList(...)得到的ArrayList对象,调用addAll方法,抛出java.lang.UnsupportedOperationException
Arrays.asList(...)得到的ArrayList对象,调用addAll方法,抛出java.lang.UnsupportedOperationException原创 2022-10-13 15:58:57 · 425 阅读 · 1 评论 -
最通俗易懂的求next数组的方法(KMP算法)
一、字符串匹配的KMP算法相信小伙伴们看了阮一峰老师讲解的KMP算法后也会有醍醐灌顶的感觉。可惜,阮老师没有去讲如何求部分匹配表(Partial Match Table),但这也是写出KMP算法的关键所在。所以,我打算再详细讲讲如何求部分匹配表,也即next数组。二、求部分匹配表(next数组)1.部分匹配值①前缀1个字符串除去末尾字符,以首字符开头的所有子串。②后缀1个字符串除去首字符,以末尾字符结尾的所有子串。比如:字符串:ABCDAB前缀:A、AB、ABC、ABCD、ABCDA原创 2021-05-24 23:14:25 · 12018 阅读 · 4 评论 -
力扣:字母异位词问题总结(242、49)
一、字母异位词如果2个字符串(仅由小写字母构成)由同一字母集组成,即为字母异位词。扩展:如果2个字符串由同一unicode字符集组成,即为字母异位词。PS:目前,字母异位词相关的力扣题只涉及小写字母。二、力扣题1. 242. 有效的字母异位词通解class Solution { public boolean isAnagram(String s, String t) { char[] tmpS = s.toCharArray(); Arrays.原创 2021-05-09 13:13:03 · 152 阅读 · 0 评论 -
力扣:快速幂问题总结(50、372)
一、计算ana^nan的3种方法1.累乘法(不推荐)double res = 1.0;while(n-- > 0) { res *= a;}时间复杂度:O(n);乘法运算本身就耗时,所以这种方式不适合用于刷力扣题。2.快速幂(二进制取幂)(1)思路①等价变换:513=5(1101)2=51⋅20+0⋅21+1⋅22+1⋅23=51⋅20⋅50⋅21⋅51⋅22⋅51⋅235^{13} = 5^{(1101)_2} = 5^{1·2^0+0·2^1+1·2^2+1·2^3}=5原创 2021-05-07 19:32:14 · 511 阅读 · 2 评论 -
力扣:数字的位操作问题总结(7、9、190)
一、数字的位操作问题有一类力扣题,要求我们对数字的每一位进行操作。比如:将123转化为321。二、力扣题1.7. 整数反转通解class Solution { public int reverse(int x) { /* 按位操作 */ /* *关键:处理溢出 *2,147,483,647 */ int res = 0; while(x != 0) {原创 2021-04-27 12:21:40 · 148 阅读 · 0 评论 -
力扣:n的幂问题总结(231、326、342)
一、n的幂问题判断一个整数是否是n的幂次方,如果是,返回true;否则,返回false。二、力扣题1.231. 2的幂 (n = 2)通解因为幂的逆运算为对数运算,所以如果整数n为2的幂(即:n==2xn == 2 ^ xn==2x),那么log2n=x\log_2n = xlog2n=x,其中xxx为非负数。class Solution { public boolean isPowerOfTwo(int n) { if(n <= 0) return fal原创 2021-04-27 10:16:03 · 201 阅读 · 0 评论 -
汇总:用滑动窗口法秒杀力扣题
一、教程:滑动窗口算法框架(Java版)二、汇总1.38. 外观数列AC代码class Solution { public String countAndSay(int n) { String pre = "1"; for(int i = 2; i <= n; i++) { String cur = ""; int left = 0, right = 0; int size =原创 2021-04-21 19:33:37 · 101 阅读 · 0 评论 -
遍历数组寻找符合条件的数:力扣(414、628)
一、母题1.414. 第三大的数延伸:既然可以求第三大的数,就可以求第n大或第n小的数。(原则上,n∈[1,3]\in[1, 3]∈[1,3])。如果n > 3, 那么采用TreeSet来解题。以第4大的数为例子:TreeSet<Integer> ts = new TreeSet<>();for(int num : nums) { ts.add(num); if(ts.size() > 4) ts.remove(ts.first());}ret原创 2021-04-17 15:31:43 · 489 阅读 · 0 评论 -
滑动窗口算法框架(Java版)秒杀力扣题(76、567、438、3、485)
一、声明1.非常感谢东哥(labuladong)分享了**滑动窗口算法框架**;2.我在理解了东哥的思想后,用Java实现了滑动窗口算法框架,一来方便自己学习,二来方便一些Java小伙伴;3.再次感谢互联网上的大佬们分享智慧结晶。二、滑动窗口算法框架滑动窗口:[left, right)Map<Character, Integer> window = new HashMap<>();int size = s.size();int left = 0, right = 0;原创 2021-04-16 17:16:40 · 776 阅读 · 2 评论 -
力扣之数组篇 物归原主法 秒杀 448 442 41
一、前言1.物归原主法给定一数组,其长度为n,其元素a[i]∈[0,n−1]\in[0, n - 1]∈[0,n−1]时,当我们把a[i]放到i = a[i]的位置时,那些重复的数值即会出现在a[i] != i的位置处。例子:[2, 3, 1, 0, 2, 5, 3]; 物归原主后:[0, 1, 2, 3, 2, 5, 3]。可见,重复的数字:2在i = 4处,3在i = 6处。当然了,有的题目做了点变体,即a[i]∈[1,n]\in[1, n]∈[1,n]时,则把a[i]放到i = a[i原创 2021-04-10 13:10:50 · 298 阅读 · 0 评论 -
vector的常见用法总结(find、assign、front、back等函数)
一、前言但凡对C++STL了解的小伙伴,大多已经熟知vector的如下用法:(0)vector头文件#include <vector>using namespace std;(1)vector的定义vector<typename> name;eg:vector<int> V;(2)vector容器内元素的访问①通过下标访问和访问普通素数一样:V[i],i∈[0,count−1]V[i], i\in[0, count - 1]V[i],i∈[0,原创 2020-11-08 21:03:01 · 2440 阅读 · 0 评论 -
经典二叉树遍历问题的总结(LeetCode 105 和 106)
经典二叉树遍历问题_仅指我个人的定义1.第1类(给遍历,构造树)(1)从中序与前序遍历构造二叉树(2)从中序与后序遍历构造二叉树(3)从中序与层序遍历构造二叉树2.第2类(给遍历,求遍历)(1)中序遍历 + 前序遍历 -> 后序遍历 || 层序遍历(2)中序遍历 + 后序遍历 -> 前序遍历 || 层序遍历(3)中序遍历 + 层序遍历 -> 前序遍历 || 后序遍历3.总结1.第1类(给遍历,构造树)(1)从中序与前序遍历构造二叉树①代码少,但性能一般/** * Definiti原创 2020-11-07 14:21:15 · 286 阅读 · 0 评论 -
利用循环不变式实习二叉树的层序遍历(LeetCode 102)
一、问题描述(二叉树的层序遍历)这道题增加的一点点难度体现在要求同一行存储与同一vector中二、利用循环不变式解决这一个小难点所谓循环不变式,结合本题的场景,通俗理解就是:一次性处理同一层,则可以使队列中永远是同一层的结点。比如:3处理完后,队列里有9、20这两个结点的地址(指针),一次性把这2个结点处理了,队列里得到的是15、7这两个结点的地址,即保证了队列中永远是同一层的结点。严谨证明,见:含循环不变式的证明三、AC代码如下class Solution {public:原创 2020-11-05 22:51:01 · 83 阅读 · 0 评论 -
C++实现二叉树的最近公共祖先
一、问题描述(236. 二叉树的最近公共祖先)二、AC代码如下(解释见注释)class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { //后序遍历的思想(递归实现) //递归边界 if(root == NULL || root == p || root == q) return root; //ro原创 2020-11-04 23:00:05 · 711 阅读 · 1 评论 -
二维vector的一些细节(用于实现LeetCode566.重塑矩阵)
一、二维vector的一些细节①定义和初始化vector<vector<int> > V(r, vector<int>(c));r表示V中有r个vector,每个vector有c个元素,故为r * c的二维矩阵。②获取行数和列数row = V.size();col = V[0].size();二、LeetCode566.重塑矩阵1.题目2.AC代码关键 : 第i个数对应的(row_id, col_id),和磁盘管理的位示图法相似。class原创 2020-10-23 22:22:25 · 128 阅读 · 0 评论 -
partition函数和stable_partition函数的小示例
一、partition函数演示1.代码#include <cstdio>#include <algorithm>#include <vector>using namespace std;int main() { vector<int> V = {2, 3, 6, 7, 1, 5, 4}; partition(V.begin(), V.end(), [](int a) { return a % 2 == 0; }); for原创 2020-10-23 17:48:40 · 188 阅读 · 0 评论 -
C++11 for循环的新写法(用于实现LeetCode238.移除零)
一、C++11 for循环的新写法1.示例代码//C++11 for循环的新写法#include <iostream>#include <vector>using namespace std;int main() { vector<int> number = {3, 4, 5, 6, 0, 2, 4}; for(int num : number) { if(num != 0) cout <<原创 2020-10-23 16:57:53 · 998 阅读 · 0 评论