题目
1 | class Solution { |
总结
- 很简单的循环判断,一开始也AC,但是代码很冗余,可读性差些,根据reference中的代码解进行修改。
References
https://leetcode-cn.com/problems/plus-one/solution/java-shu-xue-jie-ti-by-yhhzw/
Just a Blog
1 | class Solution { |
https://leetcode-cn.com/problems/plus-one/solution/java-shu-xue-jie-ti-by-yhhzw/
以下2种题解,时间均是\(O(1)\)
额外空间: \(O(n)\)
1 | /** |
额外空间:\(O(1)\)
1 | /** |
双指针法
需要注意,初始化 fastP
, slowP
快慢指针的时候的判别条件。
1 | if (!head || !head->next) return false; |
判断是否有环 <=> 判断是否指针指向nullptr
处. 判断指针是否指向nullptr
处的常数项系数更小。
注意此时的循环/条件语句的判别条件。
1 | while (slowP != fastP) |
\[ LCP(S_1 ...S_n) = LCP(LCP(LCP(S_1, S_2), S_3), ...Sn) \]
求\(2\)个字符串的最长前缀一般来说是每个字符串从头比较到尾,直到不相等为止。
但假如是\(n\)个字符串之间的比较的话,为了避免每次比较从头到尾进行,可以根据如上述公式,
若该字符串\(A\)与另一个\(B\)的前\(k\)字符串不同;
则去掉一个字符串\(A\)中的末尾字符,形成新字符串\(A'\),
与串\(B\)比较直至满足前缀完全相等的情况;
再将得到的最大公共前缀与串\(C,...,N\)比较,按上述循环进行,直至满足条件。
1 | class Solution { |
同时可以用s_0.pop_back();
或者 s_0.erase(s_0.size() - 1);
替换掉 s_0 = s_0.substr(0, s_0.size() - 1)
递归实现
额外空间:\(O(n)\)
时间:\(O(2^n)\)
1 | class Solution { |
使用emplace_back()
而不是 push_back()
我的理解:带有条件判断的DFS
回溯法=>递归实现=>自动调栈<=> DFS
Examples where std::vector::emplace_back is slower than std::vector::push_back?
1 | /** |
https://leetcode-cn.com/problems/delete-node-in-a-linked-list/solution/shan-chu-lian-biao-zhong-de-jie-dian-by-leetcode/
next
指针为next->next
1 | class Solution { |
ctor
初始化int
变量默认值是0,
s
里出现过,则自减1;t
里出现过,则自增1;s
, t
字符串的大小可能不一样。所以需要在计数前,交换一次。1 | class Solution { |
int
数组构造出一个计数器https://leetcode-cn.com/problems/valid-anagram/solution/you-xiao-de-zi-mu-yi-wei-ci-by-leetcode/