自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 力扣每日一题(分割数组)

2、从左往右遍历,如果当前元素比左边数组的最大值小就更新分界点和左边数组的最大值,因为当前元素比左边数组的最大值小,那肯定是小于右边数组的最小值,而且题目保证了左边数组肯定有一个数是比右边数组小的。1、先构建一个后缀最大值的数组,然后遍历数组,如果当前元素比后一个位置的后缀最大值小就返回当前元素的长度,因为是长度尽可能小,所以找到就可以直接返回。

2022-10-24 18:25:30 265 1

原创 力扣每日一题(优势洗牌)

题目的意思是田忌赛马,就是在nums1中选择比其大的最小数,若不存在这样的数字,则选择nums1中的最小值,用nums1的最小值比nums2的最小值,如果nums1的最小值比nums2的最小值大,就取nums1的最小值,如果小,否则就取用最小值去比nums2的最大值。开始比较,8比11小,就用最差的马比最强的马,把8放到32的位置,右指针减1,变成2,此时结果数组为。先把nums1排序变成8,12,24,32,再排序nums2,只排序下标为3,0,1,2,输出:[24,32,8,12]

2022-10-08 16:46:11 459

原创 力扣每日一题

要找每个元素的下一个小于等于它的元素,可以用单调栈,维护一个单调递增的栈,栈存储元素下标,当前元素比栈顶元素小表示栈顶元素找到了下一个小于等于它的元素,栈里面的元素都是没找到小于等于自己的元素的。当出现一个比栈顶小的元素时,我们根据大小不停地弹出栈顶当前元素就是小于等于该栈顶的第一个数了。两个循环从后面找小于等于当前数的,找到就结束内循环。...

2022-09-01 15:37:16 208

原创 JDK线程池ThreadPoolExecutor源码总结

线程池

2022-07-29 17:31:08 311

原创 JVM八股文总结

一、JVM内存区域八股文1、介绍下JVM的内存区域JVM的内存区域分为线程私有和线程共享的,线程私有的是程序计数器、虚拟方法栈、本地方法栈,线程共享的是堆、方法区和直接内存程序计数器的作用是指示下一条需要执行的字节码指令虚拟方法栈的作用是用来运行java方法,虚拟方法栈里有局部变量表,操作数栈,返回地址和动态连接本地方法栈的作用是用来运行native方法堆的作用是用来存放对象实例,堆分了三个区域,eden区,survivor区和老年代区,比例为6:3:1,survivor区又细分了from区和t

2022-01-21 16:54:40 1216

原创 LeetCode #77 组合

一、题目二、思路回溯,可以剪枝,剪枝条件是for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了,例如n=4,k=3,从3开始是不能形成有3个数的组合,只需要从1、2开始搜搜索起点的上界 + 接下来要选择的元素个数 - 1 = n,例如n = 4,k = 3,path.size为1时,还要选择2个数,最大的搜索起点为3,最后一个组合为【3,4】接下来要选择的元素个数为k - path.size()所以搜索起点的上界 = n - (k - path.siz

2022-01-21 11:10:41 252

原创 LeetCode #63 不同路径 II

一、题目二、思路动态规划,如果有障碍物dp【i】【j】为0,否则就是dp【i-1】【j】+ dp【i】【j-1】三、代码实现 public int uniquePathsWithObstacles(int[][] obstacleGrid) { int r = obstacleGrid.length; int c = obstacleGrid[0].length; int[][] dp = new int[r][c]; if (obs

2022-01-21 10:01:36 57

原创 LeetCode #59 螺旋矩阵 II

一、题目二、思路设定四个边界,由外向内一层层模拟生成数字三、代码实现public int[][] generateMatrix(int n) { int[][] res = new int[n][n]; int num = 1; int left = 0, right = n - 1, up = 0, bottom = n - 1; while (left < right && up < bottom) {

2022-01-21 09:42:34 237

原创 Leetcode #57 插入区间

一、题目二、思路遍历所有区间,先找和插入区间不重叠的左边区间,条件是当前区间右边的值小于插入区间左边的值,再找和插入区间重叠的中间区间,条件是当前区间的左边的值小于等于插入区间右边的值,新插入区间左边的值是当前区间和插入区间左边较小的值,新插入区间右边的值是当前区间和插入区间右边较大的值,剩下的区间就是和插入区间不重叠的右边区间三、代码实现public int[][] insert(int[][] intervals, int[] newInterval) { List<in

2022-01-21 09:26:51 52

原创 LeetCode #47 全排列 II

一、题目二、思路回溯,因为有重复数字,所以要对重复的路径进行剪枝,要先对数组排序才能进行剪枝,剪枝的条件是当前数字和前一个数字相同,并且前一个数字可以用,例如1 1’ 2 第二个1’和第一个1相同,已有的路径是1 1’ 2,选择第二个1’,因为第一个1可以选择所以可以生成路径1’ 1 2和1 1’ 2重复了,所以要剪枝//剪枝条件i > 0 && num[i-1] == num[i] && !visited[i-1]三、代码实现public List&l

2022-01-21 09:04:05 154

原创 LeetCode 45. 跳跃游戏 II

一、题目二、题解用贪心法,正着贪心和反着贪心反着贪心:假设最后一步能跳到最后的位置,然后从前往后找看是否有起跳点能跳到最后一个位置,有的话这个位置就是倒数第二到达的位置,一直推到第一个位置正着贪心:看第一个起跳点能跳多最远,然后当到达这个起跳点能跳的最远距离时就进行下一次跳跃,并更新下一个起跳点的最远距离,只需要遍历到倒数第二个位置,因为遍历最后一个位置肯定会进入if语句导致step多加一次三、代码实现//正着贪心public int jump(int[] nums) { in

2022-01-19 16:51:52 2579

原创 LeetCode Top100

颠倒二进制数使用分治,依次颠倒1位,2位,4位,8位,16位public int reverseBits(int n) { n = (((n & 0xaaaaaaaa) >>> 1) | ((n & 0x55555555) << 1)); n = (((n & 0xcccccccc) >>> 2) | ((n & 0x33333333) << 2)); n =

2022-01-04 11:41:25 415

原创 复习归并排序和快速排序

归并排序先分后合 后序遍历private int[] mergeSort(int[] nums, int left, int right, int[] tmp) { if (left >= right) { return nums; } int mid = (left + right)/2; mergeSort(nums,left,mid,tmp); mergeSort(nums,mid + 1

2021-12-28 17:17:16 275

原创 LeetCode复习 递归和分治系列

剑指 Offer 62 圆圈中最后剩下的数字 public int lastRemaining(int n, int m) { int[] res = new int[n+1]; res[1] = 0; for (int i = 2; i <= n; i++) { res[i] = (res[i-1] + m) % n; } return res[n+1]; }#108 将有序数组转

2021-12-28 17:02:32 172

原创 LeetCode复习 计数系列

#387 字符串中的第一个唯一字符 public char firstUniqChar(String s) { char[] chars = s.toCharArray(); int[] map = new int[26]; for (int i = 0; i < chars.length; i++) { map[chars[i] - 'a'] += 1; } for (int i = 0; i

2021-12-27 09:40:09 108

原创 LeetCode复习 滑动窗口系列

#3 无重复字符的最长子串public int lengthOfLongestSubstring(String s) { Map<Character, Integer> map = new HashMap<>(); int res = 0; int start = 0; for (int i = 0; i < s.length(); i++) { if (map.containsKey(s

2021-12-25 11:39:02 152

原创 LeetCode复习 前缀和系列

#238 除自身以外数组的乘积 public int[] productExceptSelf(int[] nums) { int[] res = new int[nums.length]; int k = 1; //算出左边的乘积 for (int i = 0; i < nums.length; i++) { res[i] = k; k *= nums[i]; } k

2021-12-24 14:23:33 178

原创 LeetCode复习 回溯系列

#17 电话号码的字母组合List<String> letterCom = new ArrayList<>(); public List<String> letterCombinations(String digits) { String[] letterMap = {" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; letterCombinationsDfs(

2021-12-23 20:28:21 489

原创 LeetCode复习 设计系列

#303 区域和检索 - 数组不可变static class NumArray { int[] preSum; public NumArray(int[] nums) { preSum = new int[nums.length]; preSum[0] = nums[0]; for (int i = 1; i < nums.length; i++) { preSum

2021-12-23 09:35:31 74

原创 LeetCode复习 栈系列

#20 有效的括号public boolean isValid(String s) { char[] chars = s.toCharArray(); if (chars.length % 2 != 0) { return false; } Deque<Character> left = new LinkedList<>(); for (char aChar : chars) .

2021-12-17 10:52:09 871

原创 LeetCode复习 位运算系列

剑指 Offer 64 求1+2+…+nint sumNum = 0; public int sumNums(int n) { //短路效应 只要n小于等于1,sumNums(n-1) > 0就不会执行 boolean x = (n > 1) && sumNums(n-1) > 0; return sumNum += n; }剑指 Offer 56 - II 数组中数字出现的次数 IIpublic i

2021-12-16 08:56:29 64

原创 LeetCode复习 双指针系列

移除重复项public int removeDuplicates(int[] nums) { int left = 0, right = 0; while (right < nums.length) { if (nums[left] == nums[right]) { right++; //找到不重复的元素 } else { n.

2021-12-13 11:48:50 192

原创 KMP算法

KMP算法的作用就是用来解决这道题:可以快速地在原串中找到匹配字符串,haystack是原串,needle是匹配字符串KMP算法的关键是next数组,next数组

2021-12-11 20:55:18 240

原创 LeetCode复习 矩阵系列

顺时针打印矩阵 public int[] spiralOrder(int[][] matrix) { int r = matrix.length; if (r == 0) { return new int[0]; } int c = matrix[0].length; int left = 0, right = c - 1, up = 0, bottom = r - 1; int[] r

2021-12-10 09:05:49 190

原创 LeetCode复习 二分查找系列

搜索插入位置public int searchInsert(int[] nums, int target) { int left = 0, right = nums.length - 1; //没找到值左指针会指向最小大于target的值 while (left <= right) { int mid = (left + right)/2; int num = nums[mid]; .

2021-12-08 09:06:49 173

原创 LeetCode复习 BFS系列

二叉树的最小深度public int minDepth(TreeNode root) { LinkedList<TreeNode> queue = new LinkedList<>(); queue.offer(root); int depth = 1; while (!queue.isEmpty()) { //第一个发现的叶子结点就是最小深度 int size = qu

2021-12-07 08:44:15 154

原创 LeetCode复习 排序系列

合并两个有序数组 public void merge(int[] nums1, int m, int[] nums2, int n) { int i = 0, j = 0, k = 0; int[] ints = new int[m+n]; while (i < m && j < n) { if (nums1[i] < nums2[j]) { ints[k] = num

2021-12-06 10:46:21 49

原创 LeetCode复习 DFS系列

岛屿数量public int numIslands(char[][] grid) { int r = grid.length; int c = grid[0].length; int res = 0; for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { if (grid[i][j] == '1') {

2021-12-03 20:42:41 146

原创 ThreadLocal源码解析

ThreadLocalThreadLocal的作用:1、是让每个线程都拥有自己的专属本地变量,即实现了线程隔离2、可以通过ThreadLocal在同一线程的不同组件中传递公共变量1、成员属性 * 用来寻址的hashcode * 使用 threadLocalHashCode & (table.length - 1) 计算结果得到的位置就是当前 entry 需要存放的位置。 */ private final int threadLocalHashCode = ne.

2021-11-30 15:57:58 517

原创 LeetCode复习 动态规划系列

最大子序和 int preMax = nums[0]; int res = preMax; for (int i = 1; i < nums.length; i++) { //前一位置是负数,对本位置没贡献 preMax = Math.max(preMax,preMax + nums[i]); res = Math.max(res,preMax); } return

2021-11-26 17:17:45 263

原创 JUC核心控件AQS源码解析第四部分(CyclicBarrier源码解析)

CyclicBarrier作用和CountDownLatch类似,不过是CountDownLatch的加强版,因为可以重复使用,并且可以指定所有线程到达栅栏后执行什么任务1、成员属性private static class Generation { boolean broken = false; } /** The lock for guarding barrier entry */ private final ReentrantLock lock = new

2021-11-26 11:40:15 250

原创 JUC核心控件AQS源码解析第三部分(共享锁、CountDownLatch源码解析)

结合CountDownLatch和CyclicBarrier了解一下AQS的共享锁部分先看下CountDownLatch是怎么使用的

2021-11-25 22:24:53 216

原创 JUC核心控件AQS源码解析第二部分(Condition条件队列)

AQS的条件队列是由AQS的内部类ConditionObject实现的,ConditionObject实现了Condition接口而阻塞队列ArrayBlockingQueue是基于ConditionObject的ConditionObject的实例要通过ReentrantLock产生拿ArrayBlockingQueue的构造函数举例,可以看到最终是调用ReentrantLock的内部类Sync的newCondition()方法产生一个ConditionObject实例 public Array

2021-11-24 20:42:31 216

原创 JUC核心控件AQS源码解析第一部分(简介、成员属性、非公平独占锁加锁和解锁流程)

AQS简介AQS是其他同步控件的基础,例如ReentrantLock,CountDownLatch,CylicBarrier,这几个类都是继承AQS然后重写AQS的模板方法实现同步的AQS维护了一个state控制加锁解锁的状态变量,一个双向链表表示等待获取锁的线程成员属性内部类Node,封装了线程static final class Node { //表示当前节点是共享状态 static final Node SHARED = new Node();

2021-11-23 22:00:14 313

原创 LeetCode复习 二叉树系列

根据前序遍历和中序遍历序列构建二叉树 public TreeNode buildTree(int[] preorder, int[] inorder) { for (int i = 0; i < inorder.length; i++) { map.put(inorder[i],i); } return buildTreeDfs(preorder,inorder,0,0,preorder.length - 1); }

2021-11-23 17:22:48 606

原创 LeetCode复习 链表系列

两数相加public ListNode addTwoNumbers(ListNode l1, ListNode l2) { boolean carry = false; ListNode dummy = new ListNode(); ListNode cur = dummy; while (l1 != null || l2 != null || carry) { int a = l1 == null ? 0 : l

2021-11-17 17:06:34 209

原创 二叉树的前中后序遍历(非递归实现)

非递归遍历二叉树就是自己使用一个栈去模拟系统栈前序遍历:先访问根节点,然后把根节点入栈,遍历左子树,再把左子树入栈,直到左子树为空,就出栈一个元素,然后遍历出栈元素的右子树 public List<Integer> preorderTraversal(TreeNode root) { Deque<TreeNode> stack = new LinkedList<>(); List<Integer> list = new A

2021-11-17 12:57:45 326

原创 JDK1.8ConcurrentHashMap源码解析第三部分(红黑树TreeNode的封装类TreeBin)

TreeBin是红黑树TreeNode的封装类,和TreeNode的区别是有一个成员变量lockState表示锁的状态,还有waiter表示等待的线程,多了几个和锁有关的方法,其他都和TreeNode大致一样 static final class TreeBin<K,V> extends Node<K,V> { TreeNode<K,V> root; //根节点 volatile TreeNode<K,V> first; //

2021-11-15 12:53:55 1029

原创 JDK1.8ConcurrentHashMap源码解析第二部分(添加元素、删除元素、扩容、查找元素)

ConcurrentHashMap源码解析第二部分,着重分析ConcurrentHashMap添加元素、删除元素、扩容、查找元素的具体流程1、添加元素添加元素用到的是putVal方法public V put(K key, V value) { return putVal(key, value, false);}//onlyIfAbsent为true时找到相同节点不替换 为false就替换final V putVal(K key, V value, boolean onlyIfA

2021-11-13 21:32:39 1166

原创 JDK1.8ConcurrentHashMap源码解析第一部分(常量、成员属性、以及一些通用方法和构造方法)

ConcurrentHashMap

2021-11-11 21:33:05 737

空空如也

空空如也

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

TA关注的人

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