- 博客(5)
- 资源 (2)
- 收藏
- 关注
原创 《剑指offer》学习笔记_面试题42_连续子数组的最大和
题目描述 输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 思路 动态规划。设表示以第个数字结尾的子数组的最大和,那么我们需要求出,其中。那么递推公式为: 直观理解就是,如果以第i-1个数字结尾的子数组的最大和小于等于0,那么以第i个数字结尾的子数组的最大和就是第i个数;相反,如果第i-1...
2019-02-12 20:39:49 244
原创 《剑指offer》学习笔记_面试题36_二叉搜索树与双向链表
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 思路 分治。 C++实现 class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree==NULL)retu...
2019-02-12 19:50:46 235
原创 《剑指offer》学习笔记_面试题40_最小的k个数
题目描述 输入n个整数,找出其中最小的k个数。 思路 方法一 可以利用快排的Partition方法,找到第k个数,其左边的所有数及该数就是我们要找的数。时间复杂度为O(n),但是需要修改数组。 方法二 维持一个大小为k的大根堆,目标是在遍历完整个数组后堆中的数就是最小的k个数。首先,先将前k个数装入到大根堆中,之后新来的数与根相比。如果小于根,则将根弹出,并将这个数插入堆中。...
2019-02-12 01:13:04 218
原创 《剑指offer》学习笔记_面试题39_数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 思路 方法一 数组中如果有一个数字出现的次数超过了数组长度的一半。如果对这个数组进行排序,那么这个数字一定是中位数。这里可以使用基于快排的Partition函数在O(n)的时间复杂度内找出中位数。 使用Partition可以将指定数字放到排序后应该在的位置,如果这个数是中位数,那么只需要再统计一下这个...
2019-02-11 23:46:47 214
原创 《剑指offer》学习笔记_面试题32_二叉树的层次遍历
题目描述 问题一:从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 问题二:从上往下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。 问题三:按照“之”字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 思路 对于问题一,只需要使用一个队列,依次将每层的节点放...
2019-02-11 00:06:45 299
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人