随笔分类 - 剑指Offer【全】
摘要:题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 思路 思路1:利用排序。排序后最前面的K个数就是最小的K个数。 (时间复杂度O(nlogn)) 思路2:快排Partition思想(Partition函数既是快排的基础
阅读全文
摘要:题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 思路 思路1:利用排序。对数组排序后,如果符合条件的数存在,则一定是数组中间的
阅读全文
摘要:题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 思路 求整个字符串的排
阅读全文
摘要:题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路 题目要求转换成排序后的双向链表,根据二叉搜索树的性质,值的大小:左子树<根节点<右子树。因此遍历方式为 中序遍历,中序遍历有 递归实现 和 非递归实现。 思路1:中序遍
阅读全文
摘要:题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路 思路1:先复制结点,用next链接,最后根据原始
阅读全文
摘要:题目描述 输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路 这道题相当于树的DFS。 1. 遍历方式(根据根节点的位置):由于路径是从根节点出发到叶节点,因此我们首先需要遍历根节点。在树
阅读全文
摘要:题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。例如{5,76,9,11,10,8}返回true;而{7,4,6,5}返回false。 思路 二叉搜索树:树中没有值相同的两个节点,对于每一个节点,它左
阅读全文
摘要:题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路 考的是二叉树的 层序遍历 。从下图可以看出,每次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的尾部。接下来到对队列的头部取出最早进入队列的节点放到ArrayList 中,重复前面的操作,直至队列中所有的
阅读全文
摘要:题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长
阅读全文
摘要:题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 思路 要求实现一个O(1)时间复杂度的返回最小值的栈。正常情况下,栈的push,pop操作都为O(1),但是返回最小值,需要遍历整个栈,时间复杂度为O(n),所以这里需要 空间换时间 的
阅读全文
摘要:题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路 这道题没有很
阅读全文
摘要:题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 思路 先 前序或层序遍历 这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶节点的左右节点之后,就得到了树的镜像。 既然是二叉树的遍历,那么就有 递归实现 和 非递归实现 两个版本 ~ 解法1(递归实现) /**
阅读全文
摘要:题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 分析 若树B是树A的子结构,则子结构的根节点可能为树A的任意一个节点。因此,需要完成以下两步操作: 第一步:在树A中找到和树B的根节点的值一样的节点 R (也就是树A的遍历); 第二步:判断树A中以
阅读全文
摘要:题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路 可以使用递归实现,也可以用非递归。 注意:需要考虑到很多很多特殊情况!!如边界条件;链表中的值有相同的情况;某一个链表中连续几个值都比另一个链表的当前值小(大)。 解法1(递归)思路:当得到
阅读全文
摘要:题目描述 输入一个链表,反转链表后,输出新链表的表头。 思路 为了反转一个链表,需要调整链表中指针的方向。当调整节点 i 的指针指向时,需要知道节点 i 本身,还需要知道 i 的前一个节点 h,因为我们需要把节点 i 的指针指向节点 h 。同时,我们还需要提前保存 i 原来的下一个节点 j ,以防止
阅读全文
摘要:题目描述 输入一个链表,输出该链表中倒数第k个结点。 分析 思路1:遍历链表两次,第一次统计出链表节点的个数n,第二次再从前往后找到第n-k+1个节点,即为所求。 思路2:只需要遍历链表一次。定义两个指针(快指针和慢指针),先让快、慢指针都指向头节点,然后让快指针向前走k-1步,指向第k个结点;接着
阅读全文
摘要:题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 分析 注意题中要求“相对位置不变”,即保持稳定性。 方法1:最简单的思路是开辟额外数组,遍历一次数组,遇到奇数直接放入新
阅读全文
摘要:题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0 分析 看似简单,需要注意的小细节比较多!!首先要充分考虑好边界条件,还要考虑到如果指数exponent为负数的情况。 解法1(传统解法,
阅读全文
摘要:题目描述 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 分析 考察位运算。 如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影
阅读全文
摘要:题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 分析 用2*1的小矩形覆盖大矩形最左边时有两种选择,竖着放或者横着放。当竖着放时,右边还剩下2*n-1的区域,覆盖方法记为f(n-1); 考虑横着放的情况,当2
阅读全文

浙公网安备 33010602011771号