- 博客(58)
- 收藏
- 关注
原创 百度笔试汽车加油问题
每段的过程都有相似性,用递归可以实现public class MinGasStation { public static int minGasStation(int numOfGS, int[] distOfGS, int[] allowedGasoline, int distance, ...
2019-04-02 22:50:53
243
原创 剑指Offer -滑动窗口的最大值(Java实现)
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1},{2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,...
2019-02-28 22:41:47
375
原创 剑指Offer - 数据流中的中位数(Java实现)
题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路分析:本题主要涉及最大堆和最小堆的问题,Java中优先级队列PriorityQueue其实就是...
2019-02-28 21:56:33
436
原创 剑指Offer - 二叉搜索树的第k个结点(Java实现)
题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。二叉搜索树:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它...
2019-02-25 21:59:15
424
原创 剑指Offer - 按之字形顺序打印二叉树(Java实现)
题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路分析:1、需要借助两个堆栈stack1,stack2。2、stack1用于记录奇数层的节点数,stack2用于记录偶数层的节点数。3、开始时先将头节点放入stack1中,并将stack1中的节点弹出的同时,将弹出节点的左右子节点...
2019-02-24 14:24:06
393
原创 剑指Offer - 二叉树的下个节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路分析:根据中序遍历的特点分析即可。1.首先分析节点的右子树,若存在找到该右子树的最左端的节点返回即可。2.若不存在,这时候需要根据父节点来判断了,若该节点是父节点的左节点,则该节点中序遍历的下个节点就是其父节点;若该节点是父节点的右节点,...
2019-01-31 14:51:03
99
原创 剑指Offer - 删除链表中重复的结点(Java实现)
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路分析:初始思路:需要三个指针,指针p1用于遍历整个链表,指针p2用于记录重复的结点,指针p3用于记录重复结点的上个结点,当头结点为重复结点时,需要舍弃。代...
2019-01-20 22:09:04
532
原创 剑指Offer - 链表中环的入口(Java实现)
题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null思路分析:经典的双指针思路:快慢指针算法算法分析参考牛客网大佬的算法分析代码实现如下://快慢指针的思路/* public class ListNode { int val; ListNode next = null; ListNode(int val) { ...
2019-01-16 22:53:37
145
原创 剑指Offer - 表示数值的字符串(Java实现)
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。思路分析:开始的时候判断出现第一位是否是符号位,若符号位不是初始位返回错误。当遍历到小数点时,判断小数点后是否满足要求。若
2019-01-14 23:37:04
238
原创 剑指Offer - 构建乘积数组(Java实现)
题目描述:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。思路分析:数组B每个位置的值就是数组A中除了同一位置上的那个数,数组中剩下的数的累积。一开始我想到的思路是先求出A数组中所有数的累积,然后再除以A[i]即可获得B[i]的值。但是题干中明确要求不能使用除法...
2019-01-13 15:10:06
152
原创 剑指Offer - 把字符串转换成整数(Java实现)
题目描述:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。数值为0或者字符串不是一个合法的数值则返回0。思路分析:将字符串转换成整数首先就应该确定字符串是整数字符串,第一位可以是符号位,可以是除0~9之外的’+’,’-'字符。对于整数字符从高位向低位遍历时,将获得的高位数...
2019-01-11 15:46:25
328
原创 剑指Offer - 孩子们的游戏(圆圈中最后剩下的数)(Java实现)
题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最...
2019-01-07 22:36:27
297
原创 剑指Offer - 扑克牌顺子(Java实现)
题目描述:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh,My God!”不是顺子…LL不高兴了,他想了想,决定大\小王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5...
2019-01-06 15:36:03
1430
2
原创 剑指Offer - 反转单词顺序(Java实现)
题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路分析:方法一...
2019-01-04 15:24:11
217
原创 剑指Offer - 和为S的两个字(Java实现)
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路分析:假设a<b,则ab>(a-1)(b+1)。这说明,从左侧开始先找到的数肯定是乘积最小的数。所以开始的思路就是从左侧开始遍历,直到找出满足条件的两个数放入集合中。但是这样的...
2019-01-01 16:09:18
890
原创 剑指Offer - 和为S的连续正数序列(Java实现)
题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck!输出描述:输出所有和为S的连续正数...
2018-12-29 15:32:31
251
原创 剑指Offer - 二叉树的深度(Java实现)
题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路分析:方法1:递归的思想解决问题。public class Solution { public int TreeDepth(TreeNode root) { if(root == null){ return...
2018-12-24 15:04:29
129
原创 剑指Offer - 数字在排序数组中出现的次数(Java实现)
题目描述:统计一个数字在排序数组中出现的次数思路分析:已下代码均通过牛客测试,主要工作只是在时间复杂度上的优化。看到排序数组,然后又看到查找。首先就想到二分查找,开始的思路是先通过二分查找找出需要统计的那个数字,找到后再从那个位置依次向后遍历。代码如下:public class Solution { public int GetNumberOfK(int [] array ,...
2018-12-22 17:33:00
480
原创 剑指Offer - 数组中的逆序对(Java实现)
暴力查找,时间复杂度O(N^2),运行超时。public class Solution { public int InversePairs(int [] array) { if(array == null || array.length &lt; 2){ return 0; } int temp =...
2018-12-20 10:33:01
325
原创 剑指Offer-第一个只出现一次的字符(Java实现)
题目描述:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回-1(需要区分大小写).思路分析:方法一:个人思路比较粗暴,将字符串转换成字符数组,按顺序遍历字符数组。需要两个指针,指针1指向首次出现的字符,指针2从指针1的位置往后遍历,找出与指针1相同的字符。1,新建一个HashSet集合,用于存储...
2018-12-18 15:21:33
2786
原创 剑指Offer-把数组排成最小的数(Java实现)
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路分析:本题的核心思想还是排序,但是如何排序是个问题。先将整型数组转换成字符串数组,然后按照自定义的比较器规则来排序。对于任意两个字符串s1和s2,比较s1+s2和s2+s1,若s1+s2小于s2+s...
2018-12-15 16:21:15
124
原创 剑指Offer - 数组中出现次数超过一半的数字(Java实现)
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路分析:方法1:借助HashMap,将数字以及出现次数依次存入Map集合中。代码实现如下:import java.util.HashMap;public cla...
2018-12-09 22:29:01
227
原创 剑指Offer - 字符串的排列(Java实现)
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路分析:本题考察的是回溯法的思想。代码实现如下:import java.util.ArrayList;import java.util.Collections;import java.util....
2018-12-06 22:44:34
233
原创 剑指Offer - 二叉搜索树与双向链表(Java实现)
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路分析:二叉搜索树(BST)有一个很关键的结论就是:中序遍历的结果是非递减(递增)序列。而本题要求将BST转换成排序的双向链表,核心就是考察二叉树的非递归中序遍历方法。需要借用栈空间,并且需要一个变量记录上一个出栈的元素。代码实现如下:public class...
2018-12-05 21:34:58
167
原创 剑指Offer - 复杂链表的复制(Java语言实现)
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路分析:方法1,借助HashMap。遍历链表,依次将节点作为键(KEY)存入Map集合中,新建一个RandomListNode对象并将当前key的数值传入该对象中,...
2018-12-02 00:23:43
106
原创 剑指Offer- 二叉搜索树的后序遍历序列(Java实现)
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路分析:BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定...
2018-11-29 23:54:26
143
原创 剑指Offer - 栈的压入、弹出序列(Java实现)
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路分析:本题需要借用一个辅助栈空间。具体思路如下:初始时,两个数组指针均在起...
2018-11-27 23:13:24
117
原创 剑指Offer - 树的子结构(JAVA实现)
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路分析:如果两个树中任意一棵树为空,则返回false;判断A树中是否包含B树,且头结点相同,如果包含则返回true,如果不包含则遍历A树的左右两个子树,并将结果返回。所以本题需要调用递归。代码实现如下:public class Solution { public boole...
2018-11-25 19:00:51
204
原创 剑指Offer - 合并两个排序的链表(java语言实现)
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路分析:其实本题的思路和归并排序时的合并两个数组类似,只不过这里合并两个链表不需要占用额外的空间。1,先判断两个链表是否都为空,并返回null。2,判断两个链表其中是否有一个是空链表,则返回另一个链表。3,当两个链表均不为空时,需要新建两个next引用用来保存两个链表头结点的下一...
2018-11-25 13:06:58
187
原创 剑指Offer - 链表中倒数第k个结点(JAVA实现)
题目描述:输入一个链表,输出该链表中倒数第k个结点。思路分析:先需要遍历一遍链表确定链表的长度,判断k值是否超出链表长度,以及k值是否合理。当k值处于合理的范围时,我们可以定义两个指针,第一个指针先走(k-1)步,第二个指针再从头结点出发,当第一个指针指向链表的末尾节点时,第二个指针所表示的节点就是该链表的倒数第k个节点。代码实现如下:public class Solution { ...
2018-11-23 15:39:19
85
原创 剑指offer - 调整数组顺序使奇数位于偶数前面(java语言实现)
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路分析:本题的核心是排序结果的稳定性,所以优先想到冒泡排序以及归并排序的思想。归并排序的思想就是将数组分为两段,第一段按照要求排好序,第二段按照要求排好序,然后再按照要求将两段拼接在一起。拼接数组方式具体如...
2018-11-23 14:50:33
118
原创 剑指offer -矩形覆盖(java实现)
题目描述:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路分析:其实这题就是跳台阶的变种题,其核心还是斐波那契数列。如上图所示:当n=1时,只有一种方式。当n=2时,存在2种摆放方式。当n>=3时,这时候需要考虑先竖着摆放还是先横着摆放的问题。当先竖着摆放时,还剩下(n-1)*2的宽度,所以...
2018-11-22 20:26:25
155
原创 剑指offer - 重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路分析:要重建一个二叉树,必须知道该二叉树的中序遍历以及前序、后序中的任一种遍历方式即可。这里是前序和中序遍历。前序遍历的第一个节点为整个二...
2018-11-20 20:52:00
87
原创 剑指offer - 从尾到头打印链表(JAVA语言实现)
题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。分析:其实就是如何将链表从尾到头到尾放入链表集合的问题。可以借助栈但是会增加额外的空间复杂度O(N),所以从节省空间复杂度层次来说,原地逆转链表然后再将逆转后的链表从表头依次放入list集合中即可。该方法所需的空间复杂度为O(1),时间复杂度为O(N)。代码实现如下:public class Solution {...
2018-11-20 20:17:17
123
原创 LeetCode - 98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/ 1 3输出: true示例 2:输入:5/ 1 4/ 3 6输出: false解释: 输入为: [5,1,4,null,null...
2018-11-19 23:31:33
110
原创 LeetCode 92 -反转链表ii
题目描述:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明: 1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL思路:可以根据反转的起始点将链表分为三个部分,反转中间部分,结束后将三个链表连接到一...
2018-11-12 21:40:58
180
原创 判断一个链表是否为回文结构-java描述
题意描述:给定一个链表的头节点head,请判断该链表是否为回文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。15->6->15,返回true。 1->2->3,返回false。分析:根据题意理解,回文结构的特点为正向和反向的结构相同。有以下三种方法:1).将链表节点依次放入栈中,然后出栈同时依次遍...
2018-11-07 23:29:15
357
原创 “之”字形打印矩阵-JAVA实现
题目描述:给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,例如:1 2 3 45 6 7 89 10 11 12“之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12分析:本体需要利用两个变量来记录起始点的位置,一个boolean型变量来判断打印顺序。其原理图如下:记录打印从左下到右上的位置为false,从右上到...
2018-11-07 22:32:38
1699
3
原创 转圈打印矩阵-java语言实现
描述:给定一个整型矩阵matrix,请按照转圈的方式打印它。例如: 1 2 3 45 6 7 89 10 11 1213 14 15 16打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11, 10分析:要想表达一个二维数组中各个点的位置,只需要确定左上角的元素的位置以及右下脚元素的位置即可。这两个点即可确定一个固定大小的二维...
2018-11-06 18:01:02
422
原创 用数组结构实现大小固定的队列和栈-java实现
1,用数组实现大小固定的栈栈的特点是先进后出,所以用数组实现栈时,只需要利用一个指针判定数据存储的位置即可,添加元素时判断指针是否超过数组长度,如果没有越界将元素添加到指针所指的位置,并将指针向右移位一格;否则返回异常,显示栈空间已满。删除元素思路类似,判断指针是否为数组初始位置,不是则将指针所指元素左边的元素返回,并将指针向左移位一格。代码实现如下:public class MyStack...
2018-11-06 15:36:25
187
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人