自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JUC并发编程小总结

JUC是Java编发编程中使用的工具类,全称为java.util.concurrent。近期在面试中屡屡被问到关于JUC的相关知识点问题,其重要性不言而喻,它可以说是每一个做Java开发的程序员不能不研究和不能不解决的问题,因此,在自己屡屡碰壁后决定对JUC的相关知识点进行一次系统的梳理,并通过博客分享的方式进行一个大概的总结,所记如下。一、与JUC相关概念回顾JUC是Java并发编程中使用的核心工具类,主要包括:(1)锁机制类Locks:Lock, Condition, ReadWriteLock等

2021-04-21 10:04:20 541 8

原创 基于XGBoost的泰坦尼克船员获救预测

XGBoost算法是陈天奇博士在2016年发表的论文XGBoost:A Scalable Tree Boosting System中提出来的。XGBoost是一个大规模并行的机器学习系统,它是目前最好的boosting开源工具包。

2022-03-23 16:50:54 1423

原创 剑指 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]。不能使用除法。示例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]问题解决使用双向动态规划解决class Solution { public int[] constructArr(int[] a) { //使

2021-06-20 09:27:12 120

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

问题描述写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2问题解决通过与、或运算class Solution { public int add(int a, int b) { int c = 0; while(b != 0) { c = (a & b) << 1; a ^= b;

2021-06-20 08:52:40 105

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

问题描述求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例1:输入: n = 3输出: 6示例2输入: n = 9输出: 45问题解决直接使用公式法解决class Solution { public int sumNums(int n) { return (1 + n) * n / 2; }}...

2021-06-20 08:43:47 81

原创 剑指 Offer 63. 股票的最大利润

问题描述假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2:输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。问题解决class

2021-06-19 09:05:15 60

原创 剑指 Offer 62. 圆圈中最后剩下的数字

问题描述0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输出: 2问题解决使用list集合解决,通过去摸得到每次要去除的索引class So

2021-06-16 09:15:14 55

原创 剑指 Offer 61. 扑克牌中的顺子

问题描述从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例 1:输入: [1,2,3,4,5]输出: True示例 2:输入: [0,0,1,2,5]输出: True问题解决class Solution { public boolean isStraight(int[] nums) { int min = 0, max = num

2021-06-14 09:20:08 62

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

问题描述把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例 1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]示例2:输入: 2输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111

2021-06-11 09:28:21 85

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

问题描述请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例 1:输入:[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“max_value”][[],[1],[2],[],[],[]]输出: [null,null,null,2,1,2

2021-06-10 08:40:22 70

原创 剑指 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 3 1 3 [-1

2021-06-09 09:28:47 77

原创 剑指 Offer 58 - II. 左旋转字符串

问题描述字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = “abcdefg”, k = 2输出: “cdefgab”示例 2:输入: s = “lrloseumgh”, k = 6输出: “umghlrlose”问题解决直接使用拼接字符串的方法class Solution { public String

2021-06-07 08:35:04 62

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

问题描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1输入: “the sky is blue”输出: “blue is sky the”示例 2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。问题解决先进后出,巧妙使用

2021-06-04 08:28:33 65

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

问题解决输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]问题解决穷尽可能,数组的排列问题,可使用滑动窗口class Solution { public int[][] findContinuousSequ

2021-06-03 09:07:29 59

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

问题描述输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]问题解决方法一:使用hash缓存进行存储class Solution { public int[] two

2021-06-03 08:22:03 68

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

问题描述一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]问题解决位运算解决class Solution { public int[] singleNumbers(int[] nums) {

2021-06-02 09:50:38 68

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

问题描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4

2021-06-01 08:49:53 54

原创 剑指 Offer 55 - I. 二叉树的深度

问题描述输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7问题解决二叉树,使用递归解决class Solution { int max; public int maxDepth(TreeNode root) { if(root == null

2021-06-01 08:12:17 61

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

问题描述示例1:输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1输出: 4问题解决使用中序遍历获取数组顺序,然后去第k位class Solution { public int kthLargest(Tr

2021-05-31 09:05:31 62

原创 剑指 Offer 53 - II. 0~n-1中缺失的数字

问题解决一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8问题解决class Solution { public int missingNumber(int[] nums) { for(int i = 0; i < nums.length;

2021-05-31 08:45:06 54

原创 剑指 Offer 53 - I. 在排序数组中查找数字 I

问题描述统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0问题解决class Solution { public int search(int[] nums, int target) { if(nums == null || nums.length == 0) return 0;

2021-05-31 08:36:10 52

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

问题描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5问题解决使用归并排序思想解决class Solution { int[] tmp; int res = 0; public int reversePairs(int[] nums) { if(nums == null || nums.length == 0) return 0;

2021-05-28 09:26:08 45

原创 剑指 Offer 50. 第一个只出现一次的字符

问题描述在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = “abaccdeff”返回 “b”s = “”返回 " "问题解决解决存在性的问题,可使用map。set和数组class Solution { public char firstUniqChar(String s) { if(s == null || s.length() == 0) return ' '; char[] table =

2021-05-27 08:51:22 50

原创 剑指 Offer 49. 丑数

题目描述我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。问题解决使用动态规划进行计算class Solution { public int nthUglyNumber(int n) { int[] dp = new int[n]; int a = 0, b = 0

2021-05-26 08:46:48 75

原创 剑指 Offer 48. 最长不含重复字符的子字符串

问题描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是

2021-05-24 09:40:11 47

原创 剑指 Offer 47. 礼物的最大价值

问题描述在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物问题解决最优路径问题,使用动态规划class Solution { public int m

2021-05-24 08:30:45 58

原创 剑指 Offer 45. 把数组排成最小的数

问题解决输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: “102”示例 2:输入: [3,30,34,5,9]输出: “3033459”问题解决使用Arrays工具类进行排序得到最小的字符串数据class Solution { public String minNumber(int[] nums) { if(nums == null || nums.length == 0) ret

2021-05-22 09:17:23 42

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

问题描述数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。示例 1:输入:n = 3输出:3示例 2:输入:n = 11输出:0问题解决class Solution { public int findNthDigit(int n) { //初始化 int digit = 1; long

2021-05-21 09:15:29 56

原创 剑指 Offer 43. 1~n 整数中 1 出现的次数

问题描述输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例 1:输入:n = 12输出:5示例 2:输入:n = 13输出:6问题解决暴力法class Solution { public int countDigitOne(int n) { //暴力法解决 int res = 0; for(int i = 1; i &lt

2021-05-20 08:45:16 45

原创 剑指 Offer 42. 连续子数组的最大和

问题描述输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。问题解决分析问题可知,可拆分为子问题,且求局部最优问题,使用动态规划。class Solution { public int maxSubArray(int[] nums) { //使用动态规划,分解为子

2021-05-20 08:16:25 49

原创 剑指 Offer 40. 最小的k个数

问题描述输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]问题解决方法一:暴力法,先排序,然后直接获取class Solution { public int[] getLeastNumbers(int[] arr, int k) {

2021-05-18 08:51:23 46

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

问题描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2问题解决方法一:先排序,再去中位数class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length / 2];

2021-05-18 08:12:29 42

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

问题描述输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]问题解决考虑全排列的解决思路,使用回溯的方法class Solution { Set<String> set = new HashSet<>(); StringBuilder sb = new StringBuilder();

2021-05-17 08:25:21 65

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

问题解决请实现两个函数,分别用来序列化和反序列化二叉树。示例:你可以将以下二叉树: 1 / \ 2 3 / \ 4 5序列化为 "[1,2,3,null,null,4,5]"问题解决使用BFS解决public class Codec { public String serialize(TreeNode root) { if(root == null) return "[]"; StringBuilder

2021-05-16 09:57:06 54

原创 剑指 Offer 35. 复杂链表的复制

问题描述请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]问题解决由于在复制链表过程中,需要找到random指针的指向,因此可考虑使用HashMap做缓存。class Sol

2021-05-14 09:05:18 55

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

问题描述输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 target = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[ [5,4,11,2],

2021-05-13 09:40:02 54

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

问题描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true问题解决对于解决树相关问题,很多时候使用递归的方法。class Solution { public boolea

2021-05-13 08:55:25 64

原创 剑指 Offer 32 - I. 从上到下打印二叉树

问题描述从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树: [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回:[3,9,20,15,7]问题解决二叉树的层序遍历,考虑使用BFS的方法class Solution { public int[] levelOrder(TreeNode root) { if(root == null) return ne

2021-05-12 09:28:30 44

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

问题描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), pu

2021-05-12 08:33:51 77

原创 剑指 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(); --> 返回 0

2021-05-09 10:03:33 67

空空如也

空空如也

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

TA关注的人

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