[001]两数之和
1° 暴力法,两次遍历数组。T(n) = O(n²),S(n) = O(1);
2° 采用hash表,将数字和对应的下标存入hash表中。然后遍历数组,求target - nums[i]是否在hash表中。T(n) = O(n), S(n) = O(n).
[002]两数相加
将各位数之和的个位数保存在vector中,若有进位,同时考虑进位。最后再利用vector中的数字构造链表。T(n) = O(n), S(n) = O(n).
[003]无重复字符的最长子串
1° 采用动态规划,设置每种情况的首尾位置并判断每种情况。测试用例未完全通过(当给的字符串足够长时,产生内存溢出)
2° 参考精选解答:用滑动窗口的方法。依次判断新加入的字符是否在set中,若不在,向后偏移;若在,删除set中前面的字符直到相同字符被删除。整个过程需用max来记录最大长度用于返回。
[005]最长回文子串
[011]盛水最多的容器
两个标志分别指向vector头尾。一次比较头尾元素大小,较小的则下标向中间移动。
[019]删除链表倒数第N个节点
双指针法。按照偏移之后是否到达尾部,分为删除头结点和非头结点。
[020]有效的括号
辅助栈和辅助Map。左括号则进栈,右括号判断是否匹配,不匹配或栈空直接返回。
[021]合并两个有序链表
1° 重新分配内存,依次比较两个链表中每个节点;
2° 先比较首节点的值,将较小的节点作为返回节点。依次将第二个链表的节点插入第一个节点的相应位置。不需额外分配空间。
[031]下一个排列
解法参见官方题解,注意字符串不要越界。
从右往左找第一对左边比右边小的数字,让后将左边的数字与右边递减串中比它大的最小的一个值交换,再将右边递减的串逆转。
[034]排序数组中找数字的第一个和最后一个位置
二分查找。查找到之后往前后依次查找。理想时间复杂度为O(logN),最坏情况时间复杂度为O(N).
[046]全排列
△△△用递归,依次交换。下标没有弄清楚。。。
[048]旋转图像
先将左上与右下的元素互换,再翻转每一行的元素。
[049]字母异位词分组
将容器用到极致!!!灵活运用map带来极大的便捷!!!
[053]最大子序和
动态规划。分析出状态方程,转换成代码。
[062]不同路径
动态规划。dp保存某个位置时的局部最大路径个数。
[094]二叉树的中序遍历
用非递归方法,写先序,中序,后序以及层次遍历。