- 3.无重复字符的最长子串
设立两个指针分别指向子串的首位和当前位,
当当前位的元素在子串中不可以被找到时,当前位元素加入子串。
当当前位的元素在子串中可以被找到时,即子串首位到当前位前一位为一个有效解,与之前所得最优解相比较更新结果。
将首位设到找到的那个位置的后一位,以保证当前位在子串中时,子串没有重复元素。
将当前位遍历完整个字符串,最后更新得到的解即为最优解。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int a=0;
int l=s.size();
int m=0;
int i;
for (i=0; i<l; i++)
{
int k=s.find(s[i],a);
if (k!=i) {m=max(m,i-a); a=k+1;}
}
return max(m,i-a);
}
};
-
4.寻找两个正序数组的中位数
先合并在找中位数,主要是要考虑各种边界情况
进阶的那个我没看懂题解 -
5.最长回文子串
用动态规划,从最简单的情况往深处迭代,左右位置为矩阵的横纵坐标,坐标点上的值代表了回文与否,后面的可以由前面的迭代获得 -
53.最大子序和
算法导论原题,用递归算法,分成跨越中间节点,不跨越的左右两边三种情况。 -
101.对称二叉树
递归很简单,就是判断两个子树值相等与否,以及各自左右右左子树是否对称
迭代使用队列,类似于宽度优先搜索,同时搜索两边,一次取两个节点比较 -
104.二叉树的最大深度
很简单的递归算法 -
121.买卖股票的最佳时机
可以类似于最大子序和用递归,但是比较麻烦
不如遍历,假设每一天卖出,则最优的买入就是之前股价最低的时候,遍历一遍就好了 -
10.正则表达式匹配
题解教的动态规划,给了迭代公式
我是用的递归算法,从后往前递归,递归公式和迭代工诗一样的,就是最小问题的情况很多比较复杂,要一点一点试错。
老实说我那个迭代公式也只是懂了个大概,还是没能确信它的完备性。 -
11.盛最多水的容器
直接遍历大概要 n 2 / 2 n^2/2 n2/2,超出时间限制
用双指针法,每次将两侧较短的一根往里走,更新最优解即可,只要走n步就好
这个方法的完备性其实我也没想太明白,只是确实我找不出反例。 -
22.括号生成
就是二叉树的宽度优先搜索,只不过有的分支肯定不满足要求的要提前排除(右括号的数目不大于左括号)