剑指Offer
dogecarlos
这个作者很懒,什么都没留下…
展开
-
剑指-用两个栈实现队列
push功能也就是往stack1中存数,pop的功能就是获得stack1栈底的元素,用stack2暂存所有stack1中出栈的元素,最后输出栈顶的元素即可原创 2019-08-19 08:59:38 · 124 阅读 · 0 评论 -
剑指-数组中的逆序对
不能采用遍历的方法,否则时间复杂度是n2,需要利用归并排序,先分治,再将两个子序列进行排序和统计,需要注意的是,我们要开创一个新的数组保存排序之后的结果,并且当j坐标代表的元素小于i坐标的元素时,那么mid到i之间的元素都是大于j代表的元素的。...原创 2019-09-16 10:03:38 · 104 阅读 · 0 评论 -
剑指-连续子数组的最大和
需要考虑动态规划解决,用dp[i]来表示以array[i]为末尾元素的连续子数组最大和,它分为两种情况,以前一个元素为末尾元素的最大和加上该元素,或者从该元素出发构造新的连续子数组。从两者选取最大值。再用一个max变量记录最大和。...原创 2019-09-15 10:56:03 · 108 阅读 · 0 评论 -
剑指-最小的k个数
这题用冒泡就可以完成,不过我居然把冒泡程序都写错了,晕,基础太差了。冒泡由两层for循环构成,最外层的for负责控制每一次冒泡排序的次数,在本题中,最外层的i就循环k次。那么,最重要的来了,最内层的for就是每次的冒泡排序,我们可以控制选出最大值或者最小值,但是注意是数组中j/j+1两个元素进行比较!老是记错,最内层的冒泡排序完成之后,我们就把本次循环中找出的最小值加入list中。...原创 2019-09-14 22:41:59 · 94 阅读 · 0 评论 -
剑指-数组中出现次数超过一半的元素
一开始想用Arrays.sort的,但是sort针对基本数据类型采用快排,时间复杂度为nlogn。还是采用评论里的思想,首先选取某个元素作为标志位,例如第一个元素,然后对数组中的元素进行遍历,相同就计数+1,不同就-1,如果计数为0说明不符合,就把该元素作为新的标志位。最后还需要判断一下是否正确。...原创 2019-09-14 22:05:54 · 117 阅读 · 0 评论 -
剑指-将二叉搜索树转为排序双向链表
完全参考评论的思路,这里简单记录一下。首先,如果想使得二叉搜索树变为有序的数组,那么必然是中序遍历。那么我们先递归出左子树的链表尾端节点,如果不为空就把其和root进行关联,同理再对右子树进行同样的处理。输入需要考虑左子树是否为空,如果是空就需要输出root。...原创 2019-09-09 10:29:00 · 93 阅读 · 0 评论 -
剑指-二叉树中和某值的路径
利用递归处理每一次深度遍历的结果。创建一个ArrayList<ArrayList>对象lists来保存所有可能的路径结果,在递归函数中,我们首先把节点的值加入某个路径结果list中,假如这时候root的左右子树都为空,则说明DFS到了叶子节点,这时候再判断叶子节点的值是否是target的值,不是的话就返回,假如是就把这个路径结果加入lists。如果root并不是叶子节点,我们就需要对...原创 2019-09-08 15:54:49 · 94 阅读 · 0 评论 -
剑指-二叉树的后序遍历
二叉搜索树,BST,是一个空二叉树,或者是,左子树的值小于它的根节点,右子树的值大于它的根节点的二叉树。题目要求是否为后序遍历,而在后序遍历的数组中,最后一位始终是根节点。我们再利用二叉搜索树的性质,进行递归处理。每次将数组的最后一位单独取出 ,从数组第一位进行查找,直到找到大于根节点的值,那么数组除了根节点的部分就可以划分为左右子树,再不断进行递归处理。递归跳出的条件为左指针大于等于右指针。...原创 2019-09-07 23:22:28 · 104 阅读 · 0 评论 -
剑指-栈的压入,弹出序列
用一个栈来存储需要压入的元素,每次压一个元素,当栈顶元素和右边待检测的数组元素相同时,说明两者匹配,栈顶元素出站,右边的数组标志位加1,这里需要注意检测这个栈是否为空!...原创 2019-09-07 22:38:55 · 107 阅读 · 0 评论 -
剑指-二进制中1的个数
在int类型长度范围内,对每一位的数字与1,如果是1就计数加1原创 2019-09-07 09:00:39 · 105 阅读 · 0 评论 -
剑指offer-重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。这题思路和我们平时根据前序遍历以及中序遍历来构建二叉树的思路是一样的,利用递归来实现整个过程,首先对于这两个数组,都设立两个指针,指向起始以及终止位,根...原创 2019-08-17 16:27:26 · 91 阅读 · 0 评论 -
剑指offer-从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。用栈存放链表的值,再一个个出栈,放入集合中。`import java.util.*;public class Solution {public ArrayList printListFromTailToHead(ListNode listNode) {Stack stack=new Stack<>();...原创 2019-08-17 11:24:54 · 152 阅读 · 0 评论 -
剑指Offer-替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。没啥好说的,用StringBuilder类就行了但是感觉不太符合题意,因为是重新构造了一个字符串,并不是在原有字符串的基础上增加。...原创 2019-08-17 10:51:19 · 85 阅读 · 0 评论 -
剑指offer1-二维数组中的查找
马上秋招了,剑指刷了两编,LeetCode也刷了前150题,但基本没有整理过思路,今天开始第三遍,每天都整理一点,希望能坚持下来。题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如1 2 34 5 67 8 9查找的话,这种递增类型...原创 2019-08-16 09:41:48 · 124 阅读 · 0 评论 -
剑指-旋转数组最小的数字
采用二分法解决,不过针对细节问题还是看评论才明白的。二分法是能想到的,但要是找最小值我就有点懵,这里应该使用指针找到最小值,当首尾指针跳出循环时,头指针的位置就是最小值。我们用中间和尾指针进行比较,因为中间值无论怎样都是大于头指针的,所以没有比较意义。1 mid大于end,说明是较大的序列占了数组的一半以上,最小值一定在中间值的右边,那么就令start=mid+12 mid小于end,说明是较...原创 2019-08-19 09:39:39 · 101 阅读 · 0 评论 -
剑指-数字在排序数组中出现的次数
这题用二分法查找该数字第一次出现和最后一次出现的位置,但是我用循环发现怎么写都不行_(:з」∠)_还是老老实实按照别人的方法用递归去写,这里方法的重点在于当mid所在的元素和k相等了如何处理。分为两种情况,1 当查找第一个出现的位置时,需要判断它是否是第一个元素,或者它前一个元素是否不是k,如果是就直接输出mid,否则end=mid-1 。2 当查找最后一次出现的位置时,需要判断它是否是数组最后一...原创 2019-09-16 11:44:38 · 122 阅读 · 0 评论