剑指offer
文章平均质量分 74
-Billy
这个作者很懒,什么都没留下…
展开
-
二维数组中的查找
1. 二分法(常规思路) public boolean Find(int target, int[][] array) { // 先对array的情况进行判断 if (array == null || array.length == 0) return false; int index = -1; for (int i=0; i<array.lengt...原创 2018-05-26 21:58:12 · 397 阅读 · 0 评论 -
合并两个排序的链表
1. 常规思路public ListNode Merge(ListNode list1, ListNode list2) { // 先对链表的情况进行判断 if (list1 == null) return list2; if (list2 == null) return list1; ListNode mergeHead = null; ListNo...原创 2018-06-10 13:14:09 · 210 阅读 · 0 评论 -
矩形覆盖
分析:public class Solution { public int RectCover(int target) { if (target < 1) { return 0; } else if (target == 1 || target == 2) { return target; ...原创 2018-07-08 11:52:55 · 982 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
分析:二叉排序树(BST),也称为二叉查找树。二叉排序树或者是一棵空树,或者是是一棵具有以下特性的非空二叉树: (1)若左子树非空,则左子树上所有结点关键字值均小于根结点关键字值。 (2)若右子树非空,则右子树上所有结点关键字值均大于根结点关键字值。 (3)左、右子树本身也分别是一棵二叉排序树。 后序遍历的特点是:先左子树、再右子树、最后根。 ...原创 2018-07-08 16:38:10 · 457 阅读 · 0 评论 -
二叉树中和为某一值的路径
1. 先序遍历的思想正向思路:public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) { ArrayList<ArrayList<Integer>> all = new ArrayList<ArrayList<Integer>>(...原创 2018-07-01 16:17:51 · 258 阅读 · 0 评论 -
数字在排序数组中出现的次数
1. 常规思路 public int GetNumberOfK(int[] array, int k) { int ncount = 0; // 计数 // 先对数组的情况进行判断 if (array == null || array.length == 0) return ncount; for (int i=0; i<array.length; i++) ...原创 2018-07-01 16:38:34 · 208 阅读 · 0 评论 -
两个链表的第一个公共结点
分析:如果两个链表有一个公共结点,那么该公共结点之后的所有结点都是重合的,即它们的最后一个结点必然是重合的. 我们先要分别遍历两个链表得到它们的长度,并求出两个长度之差.在长的链表中先遍历长度之差个结点之后,在同步遍历两个链表,直到找到相同的结点,或者一直到链表结束.此时,该方法的时间复杂度为O(len1+len2).public ListNode FindFirstCommonNo...原创 2018-07-01 17:06:08 · 275 阅读 · 0 评论 -
二叉树的深度
1. 递归 public int TreeDepth(TreeNode root) { if (root == null) // 空树,高度为0 return 0; int leftDepth = TreeDepth(root.left); // 左子树高度 int rightDepth = TreeDepth(root.right); // 右子树高度 // 树的...原创 2018-07-01 17:35:35 · 259 阅读 · 0 评论 -
数组中出现次数超过一半的数字
1. 常规思路// 常规思路 public int MoreThanHalfNum_Solution(int[] array) { // 先对数组的情况进行判断 if (array == null || array.length == 0) { return 0; } // 统计每一个数字的出现次数 return maxCountNum(array); }...原创 2018-06-26 17:44:49 · 217 阅读 · 0 评论 -
字符串的排列
分析:(1)把字符串分为两部分,一部分是字符串的第一个字符,另一部分是第一个字符以后的所有字符。(2)拿第一个字符和它后面的字符逐个交换。 public ArrayList<String> Permutation(String str) { ArrayList<String> res = new ArrayList<>(); // 存放最终的结果 if...原创 2018-07-08 17:20:36 · 224 阅读 · 0 评论 -
最小的K个数
1. 快速排序思想假设每次总是以当前表中第一个元素作为枢轴值(基准)对表进行划分,则必须将表中比枢轴值大的元素向右移动,比枢轴值小的元素向左移动,使得一趟Partition()操作之后,表中的元素被枢轴值一分为二.一趟快速排序得到的是部分有序的序列.public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k...原创 2018-07-11 17:32:13 · 311 阅读 · 0 评论 -
丑数
1. 直接法public int GetUglyNumber_Solution(int n) { if (n < 0) return 0; int number = 0; int uglyFound = 0; while (uglyFound < n) { ++number; if (isUgly(number)) { ++ug...原创 2018-07-11 20:27:45 · 288 阅读 · 3 评论 -
连续子数组的最大和
见博文https://blog.csdn.net/tc_1337/article/details/79984496原创 2018-07-24 20:59:05 · 223 阅读 · 0 评论 -
二叉搜索树的第k个结点
中序遍历思想二叉搜索树的中序遍历序列的数值是递增的。 int num = 0; TreeNode KthNode(TreeNode pRoot, int k) { if (pRoot == null || k == 0) return null; num = k; return kthNodeCore(pRoot); } TreeNode kt...原创 2018-07-19 12:22:06 · 294 阅读 · 0 评论 -
数组中只出现一次的数字
分析:首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。 这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0 。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些出现两次的...原创 2018-07-20 17:59:31 · 287 阅读 · 0 评论 -
平衡二叉树
分析:为了避免树的高度增长过快,降低二叉排序树的性能,我们规定在插入和删除二叉树的结点时,要保证任意结点的左、右子树高度差的绝对值不能超过1,将这样的二叉树称为平衡二叉树。平衡二叉树可定义为它或者是一棵空树,或者是具有以下性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度差的绝对值不超过1。先序遍历思想: public boolean IsBala...原创 2018-07-23 12:34:29 · 379 阅读 · 0 评论 -
反转链表
1. 头插法将头结点摘下,然后从第一个结点开始,依次前插入到头结点的后面(头插法建立单链表),直到最后一个结点为止,则实现了链表的逆置。public ListNode ReverseList(ListNode head) { // 先对链表的情况进行判断 if (head == null) return null; // 虚拟头结点 ListNode L = new ...原创 2018-06-10 11:33:11 · 230 阅读 · 0 评论 -
树的子结构
思路: 第一步:在树A中查找和根结点的值一样的结点.如果发现某一结点的值和树B的头结点的值相同,则进行第二步判断.第二步:判断树A中以R为根结点的子树是不是和树B具有相同的结构.如果结点R的值和树B的根节点不相同,则以R为根节点的子树和树B肯定不是具有相同的结点....原创 2018-06-24 21:45:08 · 222 阅读 · 0 评论 -
替换空格
在网络编程中,如果URL参数中含有特殊字符,如‘空格’、‘#’等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在‘%’的后面跟上ASII码的两位十六进制的表示。1. replace函数public String replaceSpace(StringBuffer str){ // 先对str的情况进行判断 if (str == nul...原创 2018-05-27 17:40:07 · 301 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。1. 递归递归函数特点:每一级函数调用时都有自己的变量,但是函数代码并不会得到复制;每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序;递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反;递归函数中必须有终止语句。public ArrayList...原创 2018-05-28 10:48:56 · 155 阅读 · 0 评论 -
二进制中1的个数
1. 常规思路 public int NumberOf1(int n) { // 将该整数转成二进制 String binaryString = Integer.toBinaryString(n); int ncount = 0; // 统计二进制中1的个数 for(int i=0; i<binaryString.length(); i++) { if (b...原创 2018-06-05 16:22:48 · 183 阅读 · 0 评论 -
重建二叉树
由先序序列和中序序列可以唯一的确定一棵二叉树。过程如下:(1)根据先序序列确定树的根节点。(2)根据根节点在中序序列中划分出二叉树的左、右子树包含哪些结点。然后根据左、右子树结点在先序序列中的次序可以确定子树的根结点。重复上述步骤,直到每棵子树仅有一个结点为止。 1. public TreeNode PreInCreate(int[] pre, int[] in, int startPre, i...原创 2018-06-13 16:12:07 · 240 阅读 · 0 评论 -
包含min函数的栈
1. 常规思路 Stack<Integer> stack = new Stack<>(); public void push(int node) { stack.push(node); } public void pop() { stack.pop(); } public int top() { return stack.peek(...原创 2018-06-13 17:36:01 · 295 阅读 · 0 评论 -
二叉树的镜像
1. 后序遍历的思想采用递归算法实现交换二叉树的左、右子树,首先交换根结点的左孩子的左、右子树,然后交换根结点的右孩子的左、右子树,最后交换根结点的左、右孩子,当结点为空时,递归结束。public void Mirror(TreeNode root) { TreeNode tmp = null; if (root != null) { Mirror(root.left); //...原创 2018-06-14 12:12:19 · 276 阅读 · 0 评论 -
栈的压入、弹出序列
1. 常规思路public boolean IsPopOrder(int[] pushA, int[] popA) { int nLength = pushA.length; Stack<Integer> s = new Stack<>(); int i = 0, j = 0; // 先对序列的情况进行判断 if (pushA == null || p...原创 2018-06-14 16:05:04 · 248 阅读 · 0 评论 -
从上往下打印二叉树
1. 层次遍历原创 2018-06-14 17:33:01 · 223 阅读 · 0 评论 -
顺时针打印矩阵
详情见博文https://blog.csdn.net/tc_1337/article/details/80056437原创 2018-06-14 17:58:20 · 252 阅读 · 0 评论 -
数值的整数次方
见博客https://blog.csdn.net/tc_1337/article/details/79857067原创 2018-06-07 22:18:08 · 163 阅读 · 0 评论 -
用两个栈实现队列
分析:入队:将元素进栈A出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈; 如果不为空,栈B直接出栈。 Stack<Integer> stack1 = new Stack<>(); Stack<Integer> stack2 = new Stack<>(); public void push...原创 2018-06-04 17:51:45 · 211 阅读 · 0 评论 -
旋转数组的最小数字
分析:旋转后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。原创 2018-06-04 16:44:30 · 574 阅读 · 0 评论 -
斐波那契数列
1. 递归求解public int Fibonacci(int n) { if (n == 0) return 0; else if (n == 1) return 1; else return Fibonacci(n-1) + Fibonacci(n-2); }2. 从下往上计算public int Fibonacci(int n) { ...原创 2018-06-02 17:54:14 · 198 阅读 · 0 评论 -
跳台阶
分析:首先考虑最简单的情况。如果只有一级台阶,则只有一种跳法。如果有2级台阶,那就有两种跳法:一种一种是分两次跳,每次跳一级;另外一种就是一次跳2级。 我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1); 另外一种选择是第一次跳2级,此时跳法数目...原创 2018-06-04 17:10:51 · 231 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
1. 快速排序的思想(相对位置会变)假设数组为L[1...n],先从前向后找到一个偶数元素L[i],再从后向前找到一个奇数元素L[j],将二者交换;重复上述过程知道i大于j。public void reOrderArray(int[] array) { // 先对array的情况进行判断 if (array == null || array.length == 0) return;...原创 2018-06-09 11:18:53 · 195 阅读 · 0 评论 -
链表中倒数第k个结点
解题思路见博文https://blog.csdn.net/tc_1337/article/details/79929690原创 2018-06-09 11:52:07 · 273 阅读 · 0 评论 -
变态跳台阶
分析:原创 2018-06-24 20:47:28 · 236 阅读 · 0 评论 -
把数组排成最小的数
解题思路:这道题目的常规求解思路是先求出这个数组中所有数字的全排列,然后把每个排列拼起来,最后求出拼起来的数字的最小值。但是这样做,时间复杂度为n!, 过于高。其实,这道题是希望我们能够找到一个排序规则,数组根据这个规则排序之后能排成一个最小的数字。要确定排序规则,就要比较两个数字,也就是给出两个数字m和n,我们需要确定一个规则判断m和n,哪个应该排在前面,而不是仅仅比较这...原创 2018-07-30 15:39:35 · 520 阅读 · 0 评论