- 博客(130)
- 收藏
- 关注
原创 KMP-28. 实现 strStr()
1. 题目大意就是字符串匹配问题,让你实现indexOf方法。2.题解要使用KMP算法。KMP主要是利用一个前缀表,前缀表指示着在匹配失败的时候从哪个位置继续匹配。相比暴力来说,每次匹配失败都是从第一个字符重新开始就快了很多。 不过目前我并没能完全理解这个算法。 public int strStr(String haystack, String needle) { if (needle.length() == 0) return 0; int[] next
2022-02-26 21:12:55
234
原创 621. 任务调度器
题目描述给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。你需要计算完成所有任务所需要的 最短时间 。解法其实就是贪心算法,每次选择当前能选择的任务中个数最多的那种任务执行
2022-01-17 16:18:44
376
原创 windows安装xpm
今天安装xpm出现了问题发现原来是我把nodejs目录移动了,虽然环境变量和教程一致,但是包并不在那里把目录换成npm包所在目录地址即可https://xpack.github.io/xpm/install/
2021-12-16 21:32:32
618
原创 543. 二叉树的直径
题目描述二叉树中距离最远的两个节点之间的距离即直径解法递归,对每一个节点求它的左右子树长度,左子树+右子树长度即以该节点为根的最长直径。虽然标着easy,但我没想出来,有正确思路了就很好写了。...
2021-12-14 15:40:16
423
原创 560. 和为 K 的子数组
题目描述就是给定K值,问数组中存在多少个连续子数组,子数组各元素和为K解法动规(其实就是把所有左边界和右边界的情况求出来,dp[i][j]表示左闭右闭)or前缀和答案前缀和+哈希表。Key为前缀和的值,Value为前缀和等于该值的子数组个数。例如当前位置为i,求出preSum[i],preSum[i]-K = target, 此时如果HashMap中有Key值target,那么说明该子数组[0,i]减class Solution { public int subarraySum(int[
2021-12-14 15:06:13
398
原创 581. 最短无序连续子数组
自己解答有点错误,某些用例过不了,和官解区别在于它left从-1开始,并且定义了一个常量。这样能解决边界的问题class Solution { public int findUnsortedSubarray(int[] nums) { //子数组里最小数大于左边所有数,最大数小于右边所有数 int len = nums.length; int left = 0, right = len - 1; while (left + 1 &l
2021-12-13 17:00:23
236
原创 647. 回文子串
题目描述 就是数子串中有多少是回文串解法 迭代,一开始我是自底向上:也就是按字符串长度1,2,3,…,len,如果字符串是回文串,就横向扩展,也就是说如果a[left-1] == a[right+1],就知道相邻的子串也是回文串。最终这种方法超时了。然后换成自顶向下:也就是从len,len-1,len-2,…,1,如果一个子串是回文串,那么这个子串的多个子串也都是回文子串。class Solution { public int countSubstrings(String s) {
2021-12-08 15:08:51
97
原创 leetcode.309
题目描述其实就是相比之前多了个卖出股票的第二天不能买入解法 同样是动态规划。但是有几个注意点。dp[i] = Math.max(dp[i], dp[i - 2] + prices[i] - prices[j])。dp方程很容易想,就是卖出价格-买入价格+第[i-2]天为止获得的最大利润。但是需要注意的是dp数组的含义,dp[i]是第i天为止能获取的最大利润,也许你是在第i-2天卖出的,此后都什么都不做,但是你的利润比在第j天买入,第i天卖出获得的利润更多。那么dp[i]等于利润最大的那个。 那么
2021-12-08 10:43:01
84
原创 windows10更新到windows11之后wsl文件系统挂载出错
本来windows磁盘是挂载到wsl的/mnt目录今天打开wsl报了文件系统错,提示说详情见dmesg命令然后我就打不开/mnt/d和/mnt/c了感觉应该是升级系统的问题,然后百度了下,cmd以管理员模式执行一个命令即可。wsl --update...
2021-11-27 10:22:03
2222
原创 工作汇报11/9
参考论文:知识图谱构建技术综述-秦志光等人概述 语义网络是一张数据构成的网络,语义网络技术向用户提供的是一个查询环境,其核心要义是以图形的方式向用户返回经过加工和推理的知识。 而知识图谱技术则是实现智能化与意见所的基础和桥梁。传统的信息检索方式已经很难满足人们全面掌握信息资源的需求。知识图谱技术的出现为解决信息检索问题提供了新的思路。定义 知识图谱是谷歌用于增强其搜索引擎功能的辅助知识库。知识图谱是结构化的语义知识库,用于以符号形式描述物理世界中的概念及其相互关系。其基本组成单位是"实体
2021-11-09 19:43:29
741
原创 单调栈例题
题目描述给一个数组,返回一个大小相同的数组。返回的数组的第i个位置的值应当是,对于原数组中的第i个元素,至少往右走多少步,才能遇到一个比自己大的元素(如果之后没有比自己大的元素,或者已经是最后一个元素,则在返回数组的对应位置放上-1)。简单的例子:input: 5, 3, 1, 2, 4return: -1 3 1 1 -1解法单调栈List<Integer> nextExceed(List<Integer> list) { List&l
2021-10-28 17:29:54
234
原创 475.供暖器
题目描述给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。解法二分贪心
2021-10-24 20:48:30
88
原创 Linux新建用户
1、新建用户useradd -d /home/xpt -m xpt-d 目录 设置用户主目录(这里设置的是/home/xpt),如果此目录不存在,则同时使用-m选项,可以创建主目录-m 目录 创建用户目录2. 切换用户su 用户名修改密码passwd 用户名将新建的用户加入sudoers file,先切换为root用户su rootvim /etc/sudoers# vim进入插入模式在文件末尾加入一行:用户名 ALL=(ALL:ALL) ALL# 然后保存退出.
2021-10-24 14:26:35
1809
原创 152.乘积最大值
题目描述解法:动态规划 数组值可能为正数,负数,0。因为负数的存在,所以不仅仅要维护最小值class Solution { public int maxProduct(int[] nums) { int max = Integer.MIN_VALUE, imax = 1, imin = 1; for(int i=0; i<nums.length; i++){ if(nums[i] < 0){ i
2021-10-18 17:54:02
169
原创 295. 数据流的中位数
题目描述设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。解法二分查找(自己写的有些边界情况有问题,完善了一会还是没ac,就放弃了)大小堆一起用来维护中位数用的是优先队列,这是我学Java以来第一次用到优先队列的地方。需要好好学一下。class MedianFinder { PriorityQueue<Integer> l =
2021-10-16 21:48:53
77
原创 107. 二叉树的层序遍历 II
题目描述层序遍历,层与层之间划分,且从底层到顶层遍历解法bfs+反转二维列表 层序遍历是最简单的。其次就是要求我们层与层遍历结果分开。而这题要求我们从底层到顶层,我们只需要将上一结果反转即可。 如何做到层与层之间比哪里结果分开?每一次大循环保存队列的初始元素个数。此即该层的元素个数。剩下的就很简单了。class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) {
2021-10-16 17:00:52
107
原创 99.恢复二叉搜索树
题目描述 二叉搜索树中两个节点被交换了位置,需要你还原解法非递归中序遍历递归中序遍历moriss遍历(暂时还没学习过) 下面的是非递归中序遍历的解法。这题的关键是如何找出那两个节点。即使找到了降序的pair,但是这个pair的前一个节点是错误的还是后一个节点是错误的? 其实是固定的。第一个pair的前一个节点是错误的,第二个pair的后一个节点是错误的。class Solution { public void recoverTree(TreeNode root) {
2021-10-16 16:38:27
231
原创 169. 多数元素
题目描述求数组中出现次数大于一半的数,要求时间复杂度为O(n),空间复杂度为O(1)解法摩尔投票法class Solution { public int majorityElement(int[] nums) { int candidate = nums[0]; int vote = 1; for (int i = 1; i < nums.length; i++) { if (candidate == nums[i
2021-10-15 17:13:53
117
原创 148. 排序链表
归并排序,每次都需根据双指针法将链表分成左右两端/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val;
2021-10-15 15:27:14
42
原创 142.环形链表II
要求不能修改原链表且空间复杂度为O(1)解法:双指针 快指针一次走两步,慢指针一次走一步。假设链表如果有环,环的长度为b,直线长度为a。从head走a步就到了环的第一个节点,从第一个节点走b步就又回到了入口。 在两指针相遇时,fast比slow多走了n圈。即slow走的距离 s = nb。 等式左右同时加a。此时slow就停在了环的入口。如何让slow恰好走a步?如果让另一个指针从head出发,走a步就也到了环的入口。即两指针相遇的地方就是环的入口。public class Solution
2021-10-15 11:30:49
67
原创 155.最小栈
自己写的时候ac不了,如下:class MinStack { Deque<Integer> xStack; Deque<Integer> minStack; public MinStack() { xStack = new ArrayDeque<>(); minStack = new ArrayDeque<>(); minStack.push(Integer.MAX_VALUE);.
2021-10-15 10:19:18
69
原创 124. 二叉树中的最大路径和
需要注意的是一个子树如果要为父节点做贡献,该贡献值在计算时,最多只能加上子树的左子树和右子树之中的一个。 另外就是因为dfs只是返回对父节点的贡献,所以需要一个全局变量来更新最大值。class Solution { int result = Integer.MIN_VALUE;//因为dfs只是返回最大贡献值,所以需要一个全局变量来更新最大值 public int maxPathSum(TreeNode root) { dfs(root); retu
2021-10-13 17:02:45
63
原创 84.柱状图中的最大矩形
解法是单调栈。下面是加哨兵的解法。public int largestRectangleArea(int[] heights) { int res = 0; int len = heights.length; if (len == 0) return 0; int[] newHeights = new int[len + 2]; for (int i = 1; i <= len; i++) {
2021-10-12 17:03:16
69
原创 25.K个一组翻转链表
方法一:笨比方法,两重循环翻转 class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; } }public class Solution { int num;//多少个为一组
2021-10-12 11:16:47
66
原创 wsl安装使用docker
1. 安装安装命令curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun我自己的电脑上是安装了两个wsl,一个是arch,一个是ubuntu,因为arch的指令有点不一样,有些指令在上面无法执行,而网上普遍都是用的ubuntu,解决方案更多。所以这次我还是用的ubuntu。但事实上网上也有arch linux安装使用docker的帖子:https://blog.youkuaiyun.com/zongza/article/detail
2021-10-10 16:04:10
220
原创 98.验证二叉搜索树
方法一:递归需要注意的是根左子树中的所有节点的值都小于根的值,根右子树中的所有节点的值都大于根的值。class Solution { public boolean isValidBST(TreeNode root) { return isValidBST(root, Long.MIN_VALUE , Long.MAX_VALUE ); } public boolean isValidBST(TreeNode root, long lower, long uppe
2021-10-10 10:32:12
68
原创 211. 添加与搜索单词 - 数据结构设计
暴力求解最后超时了,看了题解才知道什么前缀树和词典书。太菜了。解法:前缀树 定义前缀树节点类,他的成员为一个节点数组和一个boolean变量用来标志是否是某个单词尾。添加单词时,对树进行遍历,每一个树节点都相当于是一个字母,对于单词word,当遍历到字母r时,如果此时节点的数组下标’r’-‘a’为空的话,就新增一个节点。直到到达单词尾,置尾节点的isOver标志位为true,则增加单词完成。 在进行搜索的时候对该树进行遍历即可。如果遇到字符’.’,则对节点数组的每一个元素都需要搜索一遍,如果为t
2021-10-07 15:20:09
90
原创 80. 删除有序数组中的重复项 II
题目描述:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。解法:双指针。慢指针指向目前有效的数组尾,快指针指向遍历到的那一个数组元素。如果出现连续三个相同数字的话,不做操作,否则的话将nums[fast]赋值给nums[slow],并且slow++。关键在于判断是否出现三个相同数字判断为nums[fast] != nums[slow-2]。class Solution { public int removeDuplicates(i
2021-10-05 23:10:32
65
原创 6.Z字型变换
之前认为这题太笨比,然后华为面试没撕出来,自己更笨比。然后今天写的时候还写了好久。public String convert(String s, int numRows) { if (s.length() <= numRows) { return s; } if (numRows == 1) return s; //一个周期2 * numRows - 1 int unit
2021-09-28 19:13:24
85
原创 146. LRU缓存
尝试了下不自定义节点类,使用原生Map和LinkedList来完成,最终超时了。原因是在put操作中,如果put的key原本就存在,那么我们就需要更新map中该key对应的value,同时需要将list中的key移到LinkedList的头部,表示他是最近使用过的key。那么我们就需要先在LinkedList中先删除在addFirst。那么在remove()操作中,时间复杂度是O(n)。而且我暂且也找不到解决方案,因为链表除非在首位删除或增加,否则它的时间复杂度一定是O(n)。class LRUCac
2021-09-28 16:14:30
86
原创 139.单词拆分
题目要求:给定一个字符串和一个字符串列表,问该字符串能不能由列表里的单词拼接而成。字符串不为空,列表中单词拼接的时候看可以使用不止一次,也没有重复字符串。一开始的想法很简单,就是一步一步的匹配,如果匹配成功,在截取,递归对截取后的字符串做匹配。但是存在一个问题。对于用例:s = “catsandog”, wordDict = [“cats”, “dog”, “sand”, “and”, “cat”]。sandog在执行indexOf(dog)的时候结果不为0,然后我去掉开头dog.length()长度
2021-09-28 11:34:06
83
原创 近期面经1
synchronized是否可重入?是HashTable如何实现线程同步?synchronized修饰需要同步的方法b树和b+树的区别b树的中间节点即有索引又有数据,但是b+树的数据只保存在叶子节点,且叶子节点彼此相连成一个顺序列表。b+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”;b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢);对于范围查找来说,b+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历...
2021-09-17 17:10:37
89
原创 123. 买卖股票的最佳时机 III
和上一题的区别是这次最多只能交易两次。我的解法是给dp数组多加一列,用来标识当前状态交易次数。详情看注释,另外这里的话应该也可以进行空间优化,但是dp数组的话还是让人更好理解。class Solution { public int maxProfit(int[] prices) { int len = prices.length; //第二列的0代表当前交易完不剩股票,1代表当前交易完剩有股票 //第三列的n代表交易过的次数 int.
2021-09-15 16:23:42
85
原创 122. 买卖股票的最佳时机 II
给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。解法有两种,动态规划和贪心,贪心就是找到所有的上坡路,即相邻两天的股价是增长的的话必在前一天买入,在下一天卖出。很好理解。动态规划关键在于状态的定义:其实就是交易完还剩不剩股票,其实下面的代码还能在优化,因为只需要知道上一次的结果,所以没必要用数组,用O(1
2021-09-15 15:31:11
82
原创 Java BIO、NIO、AIO
BIO:同步阻塞同步阻塞式,每当有一个客户端向服务器发起请求时,服务器都要启动一个线程NIO:同步非阻塞同步非阻塞,服务器用一个线程来处理多个请求,客户端发送的请求会注册到多路复用器(selector选择器)上,有I/O请求的客户端分配线程处理AIO:异步非阻塞客户端发送的请求先交给操作系统处理,OS处理后再通知线程BIO,NIO,AIO适用场景BIO:适用于连接数比较固定的场所,显然这种方式对服务器要求比较高,是JDK1.4以前的唯一选择,但程序简单易理解NIO:适用于连接数比较多但数据比
2021-09-14 17:43:07
85
原创 函数式编程的特点
函数是一等公民函数可以和变量一样,可以赋值给其他变量,也可以作为参数,传入一个函数,或者作为别的函数返回值。只用表达式,不用语句:表达式是一段单纯的运算过程,总是有返回值。语句是执行某种操作,没有返回值。也就是说,函数式编程中的每一步都是单纯的运算,而且都有返回值。无副作用不会产生除运算以外的其他结果。同一个输入永远得到同一个数据。不可变性不修改变量,返回一个新的值。引用透明函数的运行不依赖于外部变量,只依赖于输入的参数。纯函数:同样的输入得到同样的输出,无副作用。函数组合:将多
2021-09-14 17:29:15
895
转载 MySQL覆盖索引
使用覆盖索引进行查询优化https://www.cnblogs.com/lxwphp/p/10399852.html概念 如果索引包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index),也就是平时所说的不需要回表操作判断标准 使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询注意1、覆盖索引也并不适用于任意的索引类型,索引必须存储列的值2、Hash 和ful
2021-09-14 16:52:38
97
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人