- 博客(72)
- 资源 (14)
- 收藏
- 关注
原创 剑指 Offer 59 . 滑动窗口和队列的最大值
剑指 Offer 59 - I. 滑动窗口的最大值给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7
2021-02-04 14:49:33
926
原创 剑指 Offer 57. 和为s的两个数字(连续正整数序列)
剑指 Offer 57. 和为s的两个数字输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]就是一个有序的twosum,用双指针就可以解决了。class Solution { public
2021-01-30 20:20:11
114
原创 剑指 Offer 58 翻转单词顺序&左旋转字符串
剑指 Offer 58 - I. 翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。输入: "the sky is blue"输出: "blue is sky the"输入: " hello world! "输出: "world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后
2021-01-30 20:18:39
87
原创 剑指 Offer 50. 第一个只出现一次的字符
剑指 Offer 50. 第一个只出现一次的字符在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。s = "abaccdeff"返回 "b"s = "" 返回 " "第一次遍历计数,第二次遍历看哪个为一。。好像没有什么高级的方法了。class Solution { public char firstUniqChar(String s) { char[] counts = new char[26]; for (
2021-01-30 19:19:56
82
原创 剑指 Offer 56. 数组中数字出现的次数
剑指 Offer 56 - I. 数组中数字出现的次数一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]如果只有一个数字出现一次,其他均出现两次的话,很容易想到用异或^的方法来实现,但是现在有两个数字出现了一次。如果我们可以把所有数字分
2021-01-29 13:55:05
209
原创 剑指 Offer 55. 二叉树的深度&平衡二叉树
剑指 Offer 55 - I. 二叉树的深度做的笔记突然就没了。。不过这两题都比较简单,都是树的遍历题输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。class Solution { public int maxDepth(TreeNode ro
2021-01-29 13:54:23
265
1
原创 剑指 Offer 54. 二叉搜索树的第k大节点
剑指 Offer 54. 二叉搜索树的第k大节点给定一棵二叉搜索树,请找出其中第k大的节点。输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 4输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1输出: 4这题应该也是中序遍历就OK了,但是这里由于是要拿第K大的元素,所以遍历顺序应该
2021-01-29 13:53:53
175
原创 剑指 Offer 53. 在排序数组中查找数字
剑指 Offer 53 - I. 在排序数组中查找数字 I统计一个数字在排序数组中出现的次数。输入: nums = [5,7,7,8,8,10], target = 8输出: 2输入: nums = [5,7,7,8,8,10], target = 6输出: 0这个题目看到排序,首先应该想到是二分排序,如果说直接遍历的话,估计面试官会不太高兴.应该是二分查找,然后往左和往右进行搜索.class Solution { public int search(int[] nums, int
2021-01-29 13:53:08
206
原创 剑指 Offer 52. 两个链表的第一个公共节点
剑指 Offer 52. 两个链表的第一个公共节点输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节
2021-01-29 13:52:10
189
原创 剑指 Offer 51. 数组中的逆序对
剑指 Offer 51. 数组中的逆序对在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。输入: [7,5,6,4]输出: 5这题一看就长成了我不会做的样子数组中的逆序对 - 数组中的逆序对 - 力扣(LeetCode) (leetcode-cn.com)这题y神居然没有题解,直接看官方题解把.讲的挺好的,里面的视频.分治-归并排序主要用到了归并排序的思想.基本是和归并是衣杨的,只是在将分组进行排序的时候,多了一些
2021-01-29 13:51:47
200
原创 剑指 Offer 49. 丑数
剑指 Offer 49. 丑数我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。提前把表打印好久OK了class Ugly { public int[] nums = new int[1690]; Ugly() { nums[0] = 1; int ugly, i2 = 0, i3 = 0,
2021-01-29 13:50:09
195
原创 剑指 Offer 48. 最长不含重复字符的子字符串
剑指 Offer 48. 最长不含重复字符的子字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串
2021-01-29 13:49:38
190
原创 剑指 Offer 47. 礼物的最大价值
剑指 Offer 47. 礼物的最大价值在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?输入: [ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物这题是一道比较简单的二维dp,这样判断会很费时间,可以把dp数组
2021-01-29 13:49:08
199
原创 剑指 Offer 46. 把数字翻译成字符串
剑指 Offer 46. 把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"这题其实就是斐波拉契数列的变种,也是一种比较简单的动态规划。每种状态只考虑他前面
2021-01-29 13:48:36
192
原创 剑指 Offer 45. 把数组排成最小的数
剑指 Offer 45. 把数组排成最小的数输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。输入: [10,2]输出: "102"输入: [3,30,34,5,9]输出: "3033459"也是一道找规律的题目这题还是可以想到的,比较10 和2 做比较,就判断102 和210哪个比较大就好了class Solution { public String minNumber(int[] nums) { String[] s
2021-01-21 13:44:01
533
转载 剑指 Offer 44. 数字序列中某一位的数字
剑指 Offer 44. 数字序列中某一位的数字数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。输入:n = 3输出:3输入:n = 11输出:0题解摘自面试题44. 数字序列中某一位的数字(迭代 + 求整 / 求余,清晰图解) - 数字序列中某一位的数字 - 力扣(LeetCode) (leetcode-cn.com)将 101112⋅
2021-01-21 13:14:37
569
原创 剑指 Offer 43. 1~n 整数中 1 出现的次数
剑指 Offer 43. 1~n 整数中 1 出现的次数输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。输入:n = 12输出:5输入:n = 13输出:6这题直接就放弃了好吧。。 直接看看题解面试题43. 1~n 整数中 1 出现的次数(清晰图解) - 1~n 整数中 1 出现的次数 - 力扣(LeetCode) (leetcode-cn.com)我们将 1~n 的所有数的个位出现
2021-01-21 10:50:45
554
原创 剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。兜兜转转,发现简单的动态规划还是不会。。设dp[j]dp[j]dp[j]]为以jjj结尾的子数组的最大值 可以看到,四者同时包含nums[3]nums[3]nums[3],比较四者哪个更大,其实就是
2021-01-19 15:38:23
633
原创 剑指 Offer 41. 数据流中的中位数
剑指 Offer 41. 数据流中的中位数如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元
2021-01-19 15:17:01
669
原创 剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]输入:arr = [0,1,2,1], k = 1输出:[0]这道题用优先队列当然能做出来class Solution { public int[] getLeastNumbers(int[] arr, int k) {
2021-01-19 14:31:41
671
原创 剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2摩尔投票法,投我++,不投–,超过一半以上的人投我class Solution { public int majorityElement(int[] nums) { int majorNumber = nums[0];
2021-01-19 13:52:44
654
原创 剑指 Offer 38. 字符串的排列
剑指 Offer 38. 字符串的排列输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]例子中的字符串是有重复字符的。和https://leetcode-cn.com/problems/permutations-ii/一模一样主要的思路就是回溯算法,有两种思路。一种是交换型,一种是搜索型交换回溯class Solution {
2021-01-18 16:12:48
689
1
原创 剑指 Offer 37. 序列化二叉树
剑指 Offer 37. 序列化二叉树请实现两个函数,分别用来序列化和反序列化二叉树。你可以将以下二叉树: 1 / \ 2 3 / \ 4 5序列化为 "[1,2,3,null,null,4,5]"应当注意,这里的序列是层序遍历的序列。注意一下字符串的处理就好了。数组尾有多余的null也没有关系,最后序列化和反序列是一对相反的操作。public class Codec { public String serialize(TreeNode
2021-01-18 15:23:44
638
原创 剑指 Offer 36. 二叉搜索树与双向链表
剑指 Offer 36. 二叉搜索树与双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。https://leetcode-c
2021-01-18 14:39:03
735
原创 剑指 Offer 35. 复杂链表的复制
剑指 Offer 35. 复杂链表的复制请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]输入:head = [[1,1],[2,1]]输出:[[1,1],[2,1]]这道题本质
2021-01-18 13:56:04
689
原创 面试准备-Java 容器
文章目录Java 容器一、概览Collection1. Set2. List3. QueueMap二、源码分析ArrayList1. 概览2. 扩容3. 删除元素4. Fail-FastVector1. 同步2. 扩容3. 与 ArrayList 的比较4. 替代方案CopyOnWriteArrayList1. 读写分离2. 适用场景LinkedList1. 概览2. 与 ArrayList 的比较HashMap1. 存储结构2. 拉链法的工作原理3. put 操作4. 确定桶下标5. 扩容-基本原理6.
2021-01-17 20:08:48
792
原创 面试准备-java基础
文章目录一、数据类型基本类型包装类型缓存池二、String不可变的好处String, StringBuffer and StringBuilderString Poolnew String("abc")三、运算float 与 double四、关键字finalstatic五、Object通用方法hashCode()toString()clone()六、继承访问权限抽象类与接口super重写与重载七、反射!!八、异常九、java和C++的区别一、数据类型基本类型bytecharshortin
2021-01-17 20:08:14
761
原创 剑指 Offer 34. 二叉树中和为某一值的路径
剑指 Offer 34. 二叉树中和为某一值的路径输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1sum =22[ [5,4,11,2], [5
2021-01-17 14:29:16
818
原创 剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 33. 二叉搜索树的后序遍历序列输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 5 / \ 2 6 / \1 3输入: [1,6,3,2,5]输出: false输入: [1,3,2,6,5]输出: true递归分治这题不太会。。,看了K神的讲解。。红色为中间值。class Solution { public boolean ver
2021-01-17 14:02:30
771
原创 剑指 Offer 32. 从上到下打印二叉树
标准层序遍历剑指 Offer 32 - I. 从上到下打印二叉树从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 3 / \ 9 20 / \ 15 7[3,9,20,15,7] 标准的层序遍历class Solution { public int[] levelOrder(TreeNode root) { if(root==null)return new int[]{}; Queue<Tr
2021-01-17 13:20:52
787
原创 剑指 Offer 31. 栈的压入、弹出序列
剑指 Offer 31. 栈的压入、弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2),
2021-01-17 12:54:00
772
原创 剑指 Offer 30. 包含min函数的栈
剑指 Offer 30. 包含min函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top();
2021-01-17 12:53:29
717
原创 剑指 Offer 29. 顺时针打印矩阵
剑指 Offer 29. 顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]这道题曾经也是困扰我很久的题目,现在会了。维护四个指针,分别代表最左,最右,最上,最下分别对应的边界。class Sol
2021-01-16 13:41:01
799
原创 剑指 Offer 28. 对称的二叉树
剑指 Offer 28. 对称的二叉树请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3输入:root = [1,2,2,3,4,4,3]输出:true输入:r
2021-01-16 13:21:39
808
原创 剑指 Offer 27. 二叉树的镜像
剑指 Offer 27. 二叉树的镜像请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4 / \ 2 7 / \ / \1 3 6 9镜像输出: 4 / \ 7 2 / \ / \9 6 3 1输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]一道后序遍历,从叶子节点开始交换就好了。~class Solution { public T
2021-01-16 10:48:20
808
原创 剑指 Offer 26. 树的子结构
剑指 Offer 26. 树的子结构输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \ 1 2给定的树 B: 4 / 1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。输入:A = [1,2,3], B = [3,1]输出:false输入:A = [3,4,5,1,2], B = [4,1]
2021-01-16 10:38:54
831
原创 Thread和Object类的重要方法
Thread和Object类的重要方法详解方法概览wait、notify、notifyAll当一个线程调用了wait方法,则进入阻塞状态(blocked、waiting、timed_waiting),只有下面四种情况会被唤醒另一个线程调用了这个对象的notify()方法且刚好被唤醒的是本线程另一个线程调用这个对象的notifyAll()方法过了wait(long timeout)规定的超时时间,如果传入0就是永久等待线程自身调用了interrupt方法notify 和notifyAll
2021-01-16 10:00:25
1636
原创 剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。输入:1->2->4, 1->3->4输出:1->1->2->3->4->4创建一个新的链表,把两个链表中小的节点放进来就好了,这样不断迭代,如果其中一个的指针为空了,就把另外一个直接接到后面来。class Solution { public ListNode mergeTwoLists(ListNode l1, Li
2021-01-15 14:32:19
758
原创 剑指 Offer 24. 反转链表
剑指 Offer 24. 反转链表定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL迭代首先是迭代的方法动图摘自(https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/solution/fan-zhuan-lian-biao-yi-dong-de-shuang-
2021-01-15 14:24:04
771
原创 剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.这道题也是一个双指针的问题。先让快指针先走K步,随后快慢指针逐步往前,直到快指针为空的情况class S
2021-01-15 13:58:59
792
winhex破解版
2018-12-01
dos汇编需要用的全部程序
2018-04-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人