- 博客(20)
- 收藏
- 关注
原创 JVM垃圾回收机制
JVM垃圾回收1.内存分配与回收1.1 java堆的结构大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收(Minor GC)后,如果对象还存活,则会进入 s0 或者 s1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为大于 15 岁),就会被晋升到老年代中大对象提前进入老年代,大对象就是需要大量连续内存空间的对象(比如:字符串、数组),为了避免为大对象分配内存时由于分配担保机制带来的复制而降低
2021-08-19 23:04:24 107
原创 经典排序算法分析
1.算法概述1.1 算法分类1.2 算法复杂度1.3 相关概念稳定性:如果a原本在b前面,而a=b,排序之后a仍然在b的前面,叫做稳定,如果a原本在b前面,而a=b,排序之后a可能会出现在b的后面,叫做不稳定稳定性的重要性:在实际的应用中,我们交换的不一定只是一个整数,而可能是一个很大的对象,交换元素存在一定的开销;在基数排序中,即,我们要对多个关键词多次排序,这个时候,就一定要使用稳定算法2. 冒泡排序冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟
2021-08-11 21:55:43 119
原创 Map遍历方式和性能分析
遍历方式1.迭代器EntrySet方式遍历 public static void main(String[] args) { // 创建并赋值 HashMap Map<Integer, String> map = new HashMap(); map.put(1, "Java"); //遍历 Iterator<Map.Entry<Integer, String>> iterator = m
2021-08-04 13:18:54 167
原创 7/29每日一题
1104. 二叉树寻路思路:二叉树基本性质,可以知道这是一颗满二叉树,所以每层结点数为2^(n-1),二叉树中父节点为k,它的左子节点下标为2k+1,右子节点是2k+2,所以我们知道label就能反推出路径,由于这棵树成之字形,我们可以找到label对称的结点,并反推出对称结点的路径,然后将两个路径选择结合起来代码:class Solution { public List<Integer> pathInZigZagTree(int label) { in
2021-07-29 15:50:05 46
原创 7/28每日一题
863. 二叉树中所有距离为 K 的结点思路:dfs+哈希表,首先dfs搜索二叉树,将结点值和父节点关系存入哈希表中,然后从target位置开始dfs,分三步,向左孩子结点搜索,向右孩子结点搜索,向上搜索,将距离等于k的值放入list集合代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode righ
2021-07-29 15:40:27 37
原创 7/27每日一题
671. 二叉树中第二小的节点思路:遍历二叉树,找出严格大于rootvalue 的最小值代码:public int findSecondMinimumValue(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); int min=root.val,ans=Integer.MAX_VALUE; bool
2021-07-29 15:35:03 37
原创 7/26每日一题
1713. 得到子序列的最少操作次数思路:得到最少子序列的操作数可以转换成target长度减去二者最长公共子序列长度,所以我们只要求最长公共子序列长度即可,但是由于数组长度范围1 <= target.length, arr.length <= 10^5,所以用1143. 最长公共子序列的方法求解时间复杂度是O(mn)会超时,改变思路,因为target中的每个元素都不相同,我们可以利用下标做映射,将arr中的元素映射到target的下标,可以得出一个映射下标数组,最后就是求这两个映射下标数组
2021-07-29 15:27:35 48
原创 7/24每日一题
1736. 替换隐藏数字得到的最晚时间思路:贪心,从最大值往最小值找,考虑两种特殊情况,第一位:若第二位的值已经确定,且值落在区间 [4,9]中时,第一位的值最大只能为 1,否则最大可以为 2;第二位:若第一位的值已经确定,且值为 2 时,第二位的值最大为 3,否则为 9;代码: public String maximumTime(String time) { char[] arr = time.toCharArray(); if (arr[0] == '?
2021-07-25 22:03:13 54
原创 7/25每日一题
1743. 从相邻元素对还原数组思路:哈希,遍历adjacentPairs数组,将元素和相邻元素关系存入,然后找一个只有一个相邻元素的元素作为ans数组第一个,然后遍历查找哈希表。代码:public int[] restoreArray(int[][] adjacentPairs) { Map<Integer,List<Integer>> map = new HashMap<>(); for (int[] adjacentP
2021-07-25 21:57:20 53
原创 7/23每日一题
1893. 检查是否区域内所有整数都被覆盖方法暴力:第一层for循环遍历left到right,第二层for循环遍历ranges数组,判断[left,right]之间的每个值是否在ranges区间内,如果不在flag=-1,返回flag==-1;代码 public boolean isCovered(int[][] ranges, int left, int right) { int falg=-1; for(int i=left;i<=right;i++){
2021-07-23 23:08:03 37
原创 7/22每日一题
138. 复制带随机指针的链表思路哈希+回溯,用哈希表记录每一个节点对应新节点的创建情况,遍历链表递归创建新链表,当新链表创建好了,就回溯开始添加random指针代码class Solution {Map<Node,Node> map = new HashMap();public Node copyRandomList(Node head) { if(head==null) return null; if(!map.containsKey(head)){
2021-07-22 23:46:34 52 1
原创 7/21每日一题
剑指 Offer 52. 两个链表的第一个公共节点思路双指针,A的链表长度=a+c,B的链表长度=b+c,可得a+c+b=b+c+a即A走完之后再走b就相遇了,定义两个指针然后遍历代码public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode curA=headA; ListNode curB=headB; while(curA!=curB){ curA=cur
2021-07-22 23:41:37 34
原创 7月20日,每日一题
1877. 数组中最大数对和的最小值思路:排序+贪心,局部最优:第k大个数和第k小的数组成的数对,可以避免出现较大的数组成数对的情况代码 public int minPairSum(int[] nums) { Arrays.sort(nums); int pair = 0; for (int i = 0; i < nums.length / 2; i++) { int tmp = nums[i] + nums[n
2021-07-20 20:19:17 34
原创 7月19日,每日一题
1838.最高频元素的频数思路:排序+暴力,超时,排序+滑动窗口,数组问题考虑用滑动窗口来做,定义左边界为l,右边界为r,我们只要保证窗口内元素和左边界r的差值和小于等于K即可,设差值和为count,最大可能频数为anscount<=k,不做处理;count>k,减去左边界和右边界的差值,并l++;ans取最大的窗口长度,即max(ans,r-l+1);代码:public int maxFrequency(int[] nums, int k) {
2021-07-19 16:40:23 42
原创 Java语言的特点
Java语言的特点简单性java语法是c++语法的一个“纯净”版本,没有头文件、指针运算(甚至是指针语法)、结构、联合、操作符重载、虚基类等面向对象封装、继承(Java中类是单继承,接口可以多继承,类可以实现多接口)、多态分布式Java有一个丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的对象,其便捷程度就好像在访问本地文件一样健壮性Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题,Java和
2021-06-15 00:13:30 418 3
原创 二叉树(二)
110.平衡二叉树思路:如何判断当前传入节点为根节点的二叉树是否是平衡二叉树呢,当然是左子树高度和右子树高度相差。分别求出左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则则返回-1,表示已经不是二叉树了代码:class Solution { public boolean isBalanced(TreeNode root) { return depth(root)!=-1; } public int depth(TreeNode ro
2021-06-09 11:24:12 44
原创 二叉树(一)
二叉树遍历前序遍历//递归实现class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> ans = new ArrayList<Integer>(); preorder(root,ans); return ans; } public void preorder(TreeNode
2021-06-09 11:22:29 38
原创 Java和Php的区别
Java:半编译半解释的语言PHP:脚本语言Java:JIT运行时编译热点代码PHP:具有opcache机制,能够把脚本对应的opcode缓存在内存,PHP7中还支持配置opcache.file_cache导出opcode到文件Java:通过JDBC来访问数据库,通过不同的数据库厂商提供的数据库驱动方便地访问数据库。访问数据库的接口比较统一。PHP:对于不同的数据库采用不同的数据库访问接口,所以数据库访问代码的通用性不强。PHP的库函数:用C实现Java核心运行时的类库(jdk/jre/li.
2021-06-09 11:20:42 57
原创 力扣每日一题
##523.连续的子数组和方法:使用前缀和+哈希进行判断首先,创建nums的前缀和数组preNum,用 preSum[i] 表示 从下标 0 到下标i 的前缀和,则nums从下标 p+1到下标 q的子数组的长度为q−p,该子数组的元素和为preNum[q]-preNum[p]。子数组即满足大小至少为 2 且元素和为 k 的倍数即preNum[q]-preNum[p]是k的倍数且q-p>=2。当preNum[q]-preNum[p]是k的倍数的时候,preNum[q]和preNum[p]除以
2021-06-09 11:10:38 325
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人