自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(81)
  • 收藏
  • 关注

原创 剑指 Offer 14- II. 剪绳子 II

剑指 Offer 14- II. 剪绳子 II题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。解答class S

2022-04-04 13:14:48 259

原创 剑指 Offer 44. 数字序列中某一位的数字

剑指 Offer 44. 数字序列中某一位的数字题目描述数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。解答class Solution { public int findNthDigit(int n) { int digit = 1; long start = 1,count = 9; w

2022-04-04 13:12:21 302

原创 剑指 Offer 17. 打印从1到最大的n位数

剑指 Offer 17. 打印从1到最大的n位数题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。解答class Solution { public int[] printNumbers(int n) { System.out.println("n:"+n); int max = 0; for(int i = 0;i < n;i++){

2022-03-30 12:35:30 483

原创 剑指 Offer 51. 数组中的逆序对

剑指 Offer 51. 数组中的逆序对题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解答class Solution { // 将数组划分两段进行归并排序(按从小到大排),确保前后两段都是有序的 // 在排序过程中当后面那一段的某个元素被选中时,则前面那段中剩下的元素都可以和当前元素组成逆序对, // 依此类推,在排序的过程中可计算得到数组中逆序对的总数 // 我们可以将数组拆分

2022-03-30 12:33:18 110

原创 剑指 Offer 49. 丑数

剑指 Offer 49. 丑数题目描述我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。解答class Solution { /** 动态规划五部曲: 确定dp数组及其下标的含义 dp[i]代表第i+1个丑数 确定递推公式 丑数的递推性质:因为丑数只含质因子2、3和5所以,丑数 = 某较小丑数 × 某因子 所以,丑数d

2022-03-29 09:53:33 150

原创 剑指 Offer 60. n个骰子的点数

剑指 Offer 60. n个骰子的点数题目描述把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。解答class Solution { /** 设输入 n 个骰子的解(即概率列表)为 f(n) ,其中「点数和」 x 的概率为 f(n,x) 。 具体来看,由于新增骰子的点数只可能为 1 至 6 ,因此概率 f(n−1,

2022-03-29 09:52:11 142

原创 剑指 Offer 38. 字符串的排列

剑指 Offer 38. 字符串的排列题目描述输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。解答class Solution { /** 通过当前字符和后方字符的不断交换得到所有的排列结果 */ List<String> res = new ArrayList<>(); char[] cs; public String[] permutation(Str

2022-03-28 10:07:49 59

原创 剑指 Offer 37. 序列化二叉树

剑指 Offer 37. 序列化二叉树题目请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。解答/** * Definition for a bi

2022-03-28 10:04:54 71

原创 剑指 Offer 59 - I. 滑动窗口的最大值

剑指 Offer 59 - I. 滑动窗口的最大值题目描述给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。解答class Solution { /** 采用大顶堆的数据结构: 定义一个大顶堆,当滑动窗口向右移动时,将新包含的元素插入到大顶堆中; 然后读取堆顶元素即为当前滑动窗口中的最大值,如果堆顶元素不在滑动窗口范围内, 那么他一定在滑动窗口左边界的左边,以后随着滑动窗口右移,他也肯定不会出现在滑动窗口范围

2022-03-26 13:40:47 594

原创 剑指 Offer 59 - II. 队列的最大值

剑指 Offer 59 - II. 队列的最大值题目描述请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1解答class MaxQueue { /** 使用单调队列解决滑动窗口的最大值问题: 本质上是一个求滑动窗口最大值的问题。这个队列可以看成是一个滑动窗口,入队就是将窗口的右

2022-03-26 13:39:00 331

原创 剑指 Offer 67. 把字符串转换成整数

剑指 Offer 67. 把字符串转换成整数题目描述写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对

2022-03-25 13:08:45 82

原创 剑指 Offer 20. 表示数值的字符串

剑指 Offer 20. 表示数值的字符串题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。数值(按顺序)可以分成以下几个部分:若干空格一个 小数 或者 整数(可选)一个 'e' 或 'E' ,后面跟着一个 整数若干空格小数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+' 或 '-')下述格式之一:至少一位数字,后面跟着一个点 '.'至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字一个点 '.' ,后面跟着至少一位数字整数(按顺序)

2022-03-25 13:06:57 71

原创 剑指 Offer 29. 顺时针打印矩阵

剑指 Offer 29. 顺时针打印矩阵题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。解答class Solution { /** 定义上、下、左、右四个边界,根据四个边界作为起始终止的条件进行遍历 */ public int[] spiralOrder(int[][] matrix) { if(matrix.length == 0){ return new int[0];

2022-03-24 13:43:05 127

原创 剑指 Offer 31. 栈的压入、弹出序列

剑指 Offer 31. 栈的压入、弹出序列题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。解答class Solution { /** 考虑借用一个辅助栈stack,模拟压入/弹出操作的排列。根据模拟是否成功,即可得到结果

2022-03-24 13:41:49 76

原创 剑指 Offer 14- I. 剪绳子

剑指 Offer 14- I. 剪绳子题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。解答class Solution { /** 动态规划五部曲 确定dp数组及其下标的含义

2022-03-23 20:46:59 173

原创 剑指 Offer 57 - II. 和为s的连续正数序列

剑指 Offer 57 - II. 和为s的连续正数序列题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。解答class Solution { /** for循环遍历 */ /* public int[][] findContinuousSequence(int target) { List<List<

2022-03-23 20:45:29 75

转载 剑指 Offer 62. 圆圈中最后剩下的数字

剑指 Offer 62. 圆圈中最后剩下的数字题目描述0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。解答class Solution { public int lastRemaining(int n, int m) {

2022-03-23 20:44:00 70

原创 剑指 Offer 66. 构建乘积数组

剑指 Offer 66. 构建乘积数组题目描述给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。解答class Solution { /** 根据数组A构建前缀乘积数组C1(不含自身,即C[i] = C[0]*C[1]*...C[i-1]) 根据数组A构建后缀乘积数组C2(不含自身

2022-03-22 12:07:23 160

原创 剑指 Offer 39. 数组中出现次数超过一半的数字

剑指 Offer 39. 数组中出现次数超过一半的数字题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。解答class Solution { /** 声明一个寄存器和一个计数器 寄存器记录当前计数器大于0时记录的数字,当计数器等于0时就换成当前遍历到的数字 计数器会根据寄存器中存的数字和扫描到的数组进行加减操作 如果两数字相等,计数器+1 如果不行相等时,

2022-03-22 12:05:07 111

原创 剑指 Offer 56 - II. 数组中数字出现的次数 II

剑指 Offer 56 - II. 数组中数字出现的次数 II题目描述在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。解答class Solution { /** 位运算 考虑数字的二进制形式,对于出现三次的数字,各 二进制出现的次数都是3的倍数。 因此,统计所有数字的各二进制中1的出现次数,并对3求余,结果则为只出现一次的数字 */ public int singleN

2022-03-21 14:07:52 91

原创 剑指 Offer 56 - I. 数组中数字出现的次数

剑指 Offer 56 - I. 数组中数字出现的次数题目描述一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。解答class Solution { /** 分组异或: 在异或计算过程中,成对出现的数字的所有位会两两抵消为0, 最终得到的结果为两个出现了一次的数字的异或结果 当只有一个数字出现一次时,那最后出现的结果就是那个出现了一次的数

2022-03-21 14:06:17 137

原创 剑指 Offer 65. 不用加减乘除做加法

剑指 Offer 65. 不用加减乘除做加法题目描述写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。解答class Solution { /** 本位和n = a 异或 b 进位c = (a 与 b)左移一位 和s = a + b = 本位和(n) + 进位(c) 因为不能用加法,所以n + c 又用上面的方法算(递归), 直到进位c为0,本位和 + 进位就等于 本为和 因为进位c是通

2022-03-20 11:28:05 61

原创 剑指 Offer 07. 重建二叉树

剑指 Offer 07. 重建二叉树题目描述输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。解答/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x;

2022-03-19 14:24:04 955

原创 剑指 Offer 33. 二叉搜索树的后序遍历序列

剑指 Offer 33. 二叉搜索树的后序遍历序列题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。解答class Solution { /** 递归分治: 根据二叉搜索树的定义,可以通过递归,判断所有子树的正确性(即其后序遍历是否满足二叉搜索树的定义), 若所有子树都正确,则此序列为二叉搜索树的后序遍历 递归解析:

2022-03-19 14:21:38 245

原创 剑指 Offer 16. 数值的整数次方

剑指 Offer 16. 数值的整数次方题目描述实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。解答class Solution { public double myPow(double x, int n) { if(x == 0){ return 0; } double res = 1.0; long b

2022-03-19 13:51:13 161

原创 剑指 Offer 64. 求1+2+…+n

剑指 Offer 64. 求1+2+…+n求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解答class Solution { /** 逻辑运算符的短路效应: 常见的逻辑运算符有三种,即“与 &&”,“或 ||”,“非 !”;而其有重要的短路效应 if(A && B) //若A为false,则B的判断不会执行(即短路),直接判定A

2022-03-18 14:54:30 106

原创 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]解答/** * Definition for a binary tree node.

2022-03-18 14:53:27 51

原创 剑指 Offer 68 - II. 二叉树的最近公共祖先

剑指 Offer 68 - II. 二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]解答/** * Definition for a binary tree node. * pub

2022-03-18 14:52:22 55

原创 剑指 Offer 55 - II. 平衡二叉树

剑指 Offer 55 - II. 平衡二叉树题目描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。解答/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val

2022-03-17 13:06:25 639

原创 剑指 Offer 41. 数据流中的中位数

剑指 Offer 41. 数据流中的中位数题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解答class MedianFinder { /** 解题思路:给定一长度为N的无序数组,其中位数的计算方法:首先对数组执行排序(使用O(NlogN)时间), 然后返回中间元素即可(使用O(1)时间)

2022-03-16 11:33:36 65

原创 剑指 Offer 34. 二叉树中和为某一值的路径

剑指 Offer 34. 二叉树中和为某一值的路径题目描述给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。解答/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *

2022-03-14 13:29:32 696

原创 剑指 Offer 36. 二叉搜索树与双向链表

剑指 Offer 36. 二叉搜索树与双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。解答/*// Definition for a Node.class Node { public int val; public Node left; public Node right; public Node() {} public Node(int _val) {

2022-03-14 13:27:39 696

原创 剑指 Offer 54. 二叉搜索树的第k大节点

剑指 Offer 54. 二叉搜索树的第k大节点题目描述给定一棵二叉搜索树,请找出其中第 k 大的节点的值。解答/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution {

2022-03-14 13:25:31 132

原创 剑指 Offer 13. 机器人的运动范围

剑指 Offer 13. 机器人的运动范围题目描述地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?解答class Solution {

2022-03-13 11:04:38 68

原创 剑指 Offer 12. 矩阵中的路径

剑指 Offer 12. 矩阵中的路径问题描述给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。解答class Solution { /** 解题思路: 本问题是典型的矩阵搜索问题,可使用 深度优先搜索(DFS)+剪枝 解决

2022-03-13 11:02:51 80

原创 剑指 Offer 58 - I. 翻转单词顺序

剑指 Offer 58 - I. 翻转单词顺序题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。解答class Solution { public String reverseWords(String s) { StringBuilder sb = new StringBuilder(); int i =

2022-03-12 14:09:33 100

原创 剑指 Offer 57. 和为s的两个数字

剑指 Offer 57. 和为s的两个数字题目描述输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。解答class Solution { /** 双指针法 两个指针分别指向数组的两端left、right 当两指针指向数的和小于target时,left++ 当两指针指向数的和大于target时,right-- 当两数和==target或left &

2022-03-12 13:50:41 106

原创 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。解答class Solution { /** 双指针 两个指针从相同的一端出发 */ /* public int[] exchange(int[] nums) { if(nums.length == 0){ return nu

2022-03-12 13:35:21 92

原创 剑指 Offer 25. 合并两个排序的链表

剑指 Offer 25. 合并两个排序的链表题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。解答/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { /** 比较两个链

2022-03-11 10:27:53 190

原创 剑指 Offer 22. 链表中倒数第k个节点

剑指 Offer 22. 链表中倒数第k个节点题目描述输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。解答/** * Definition for singly-linked list. * public class ListNode { * int val; * ListN

2022-03-10 11:05:13 55

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除