开始之前
1.只出现一次的数字
题目:一个数组中除了一个数字外都出现两次,找出这个出现一次的数字。
思路:所有数字进行异或操作。相同的数字之间会相互抵消,变成0。剩下一个数字和0异或还是它本身。
2.多数元素
题目:在一个数组中,有一个数字出现次数大于n/2次。O(n)时间复杂度求这个数字
思路:投票算法
3.搜索二维矩阵II
题目:一个数组。每一行的元素,从左到右递增。每一列的元素从上到下递增。给一个目标值target,求问该值是否在数组中存在。
思路:从右上角开始寻找。大了往左,小了往下。或者从左下角开始找,大了往上,小了往右。
4.合并两个有序数组
思路:从后往前合并
字符串
1.验证回文串
题目:只考虑数字和26个英文字母,不区分大小写,空字符串认为是回文。判断字符串是否为回文串。
思路:提取转大写方法、检查是否为数字或英文字母方法。双指针,一前一后,寻找合法字符进行非回文判断。
二叉树
1.非递归前、中、后序遍历二叉树
都要使用栈,前序、中序使用一个栈,后序使用两个栈
前序:(1)申请一个栈,root放入栈中。(2)弹出栈顶元素,打印。按先右再左的顺序入栈。(3)重复2直到栈为空。
前序比较直观,是3种遍历种实现最简单的。注意左右元素入栈时按先右再左,这样出栈时就是先左再右了。
中序:中序不像先序那么直观。涉及到要找到最左结点。head=root。当head不为空时,处于找最左结点的过程。当head为空时,就找结束了。可以打印栈顶元素(最左结点)。然后令head=peek.right。这样就可以继续打印右子树了。如果右子树为null,这继续弹出。
注意:判断条件为Head是否为null,决定了处于哪个过程。
后序:相对复杂的一个。需要使用两个栈。按中左右放入第一个栈。依次弹出放入第二个栈。第二个栈依次出栈就是后序。
双指针
LC11 盛最多水的容器
i=0,j=length - 1
i++,j–,谁小谁变化
可证明不会错过最大值:假设i先到达最优解,j一定还在最优解外边,且到达之前i不会错过,否则就不是最优解。
LC12 整数转罗马数字
构造好两个数组作为map,遍历即可
2021/3/3
今天刷题有了新体会:最重要的是找到解题方法的过程。如何一步步思考才能做出一道道的题。每次只是记住思路是什么还不够,要掌握的是得出思路的方法。
LC23 合并K个有序链表
如何分析一道题:拆解题目、拆解为小问题
LC30 串联所有单词的子串
使用了暴力求解。
注意利用words所有单词长度都相同的条件。
用两个map比较,无序、可能重复的单词组是否相同。
动态规划
提出dp的含义很关键,即dp[i]表示啥,也可能是dp[i][j].
应该从多个角度都想一想。常见的含义:
dp[i]表示以i结尾的题目正确解、以i开头的正确解答、长度为i的正确解;
dp[i][j]表示从i到j的正确解
还常常以长度为遍历条件。