算法面试题汇总

开始之前

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的正确解
还常常以长度为遍历条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值