11 2020 档案
摘要:题目 239. 滑动窗口最大值 思路1(暴力) 每次移动窗口都要重新遍历窗口的值来找到最大值 但是超时了,所以不合题意,题目要求线性时间 代码 class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int len =
阅读全文
摘要:题目 1052. 爱生气的书店老板 思路1(滑动窗口1) 先求出老板不生气时候的顾客总数 然后遍历一次customer,i < X就是刚开始取前 X 个大小的窗口先计算,然后接下来每次移动一个单位 每次窗口的计算可以基于上一个窗口的结果来计算 窗口右移,左边窗口出去一个元素,右边窗口进入一个元素 对
阅读全文
摘要:题目 876. 链表的中间结点 思路 利用快慢指针 慢指针一步走一个,快指针一步走两个 当快指针到达终点时候,slow刚好在中间 代码 class Solution { public ListNode middleNode(ListNode head) { ListNode slow = head;
阅读全文
摘要:题目 26. 删除排序数组中的重复项 思路 使用快慢指针 初始化:将慢指针slow指向数组索引为 0 的位置,然后快指针fast指向索引为 1 的位置 例如:0 0 1 1 1 2 2 3 3 4: 此时:0 0 1 1 1 2 2 3 3 4,我们比较 slow 和 fast 的大小,0和0相等,
阅读全文
摘要:题目 74. 搜索二维矩阵 思路1(暴力) 遍历二维数组的所有的元素,看看是否存在target 代码 class Solution { public boolean searchMatrix(int[][] matrix, int target) { for (int i = 0; i < matr
阅读全文
摘要:题目 35. 搜索插入位置 思路 类似在1-100中猜数字,用二分法最多只要猜7次就可以得到答案 这题也可以利用二分法不断向target逼近 我们可以将 target 存在 和 不存在 两种结果整合在一个判断中,即target <= nums[mid] 代码 class Solution { pub
阅读全文
摘要:题目 30. 串联所有单词的子串 思路1(滑动窗口+哈希表) 使用HashMap,这样子就可以不用纠结字符串的顺序了 先计算words中的每个单词出现的个数 每次确定starts位置,然后依次截取wordLen长度的字串,比较是否再words中,不存在的话,直接break,进入下一个窗口;存在的话,
阅读全文
摘要:题目 3. 无重复字符的最长子串 思路(滑动窗口+哈希集合) 使用滑动窗口来解决 首先遍历一遍字符串 使用哈希集合,先判断下一个字符是否存在,如果不存在的话就往set中添加字符,继续判断下一个;如果存在的话,就停止添加,然后向右移动一个窗口 每次窗口向右移动时,窗口中最左边的元素必然会出去,所以需要
阅读全文
摘要:题目 447. 回旋镖的数量 思路1(暴力,不推荐) 暴力三层循环,搜索所有的结果 超时,不推荐 代码 class Solution { public int numberOfBoomerangs(int[][] points) { int res = 0; for (int i = 0; i <
阅读全文
摘要:题目 347. 前 K 个高频元素 思路1(哈希表与排序) 先用哈希表记录所有的值出现的次数 然后将按照出现的次数进行从高到低排序 最后取前 k 个就是答案了 代码 class Solution { public int[] topKFrequent(int[] nums, int k) { Has
阅读全文
摘要:在Java中有两个比较器:Comparable、Comparator 对于Integer、Double等等类型,可以直接对他们进行比较,因为已经实现了比较的方式,然而在平时常常会面临需要对集合进行排序的情况,这种情况下我们需要人工定义Java比较器,告诉程序两个对象如何比较大小。 Comparabl
阅读全文
摘要:题目 1. 两数之和 思路1(暴力枚举) 遍历数组 在每次遍历时,记录下target减去当前数组的值为temp 再从当前位置开始的后一个(因为同一个元素不能遍历两次)元素开始遍历到结束,如果和temp值相等,那么就将i和j的索引值记录到res中,返回res即可 代码 class Solution {
阅读全文
摘要:题目 1382. 将二叉搜索树变平衡 思路 由于BST二叉搜索树的中序遍历是升序的,所以我们可以先通过中序遍历将该树转换为链表 然后再通过中序遍历,此时选取的是链表的中点作为树的根节点,将链表恢复为一颗平衡的二叉搜索树 代码 class Solution { class ListNode{ int
阅读全文
摘要:题目 108. 将有序数组转换为二叉搜索树 思路(中序遍历的递归) 中序遍历,选择中间位置作为根节点 二叉搜索树的中序遍历是升序的,所以我们可以根据升序遍历来恢复二叉搜索树 又因为是要平衡的,所以我们选取数组中间位置的值创建节点 代码 class Solution { public TreeNode
阅读全文
摘要:题目 110. 平衡二叉树 思路1(自顶向下的递归) 要判断是否为平衡二叉树,那么首先就判断他的左右子树高度差有没有超过1,没有超过1的话就继续判断他的左右子树是否为平衡二叉树 将大问题分成小问题进行解决,自顶向下 判断高度用dfs来计算 代码 class Solution { public boo
阅读全文
摘要:题目 987. 二叉树的垂序遍历 思路 垂直遍历就是在同一行中,由上到小输出,然后再由小的列到大的列进行输出 可以将节点用二维坐标表示, 先将节点绑定坐标信心存入到locations集合中,按照我们自定义的方式进行排序 排序完后,在遍历该集合,如果x相同,那么就加入到同一个子集合中,如果x不相同,那
阅读全文
摘要:题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前、中、后、层序遍历是不够的,必须在序列化时候保存所有信息,这样子反序列化才可以完全恢复一颗树 利用层序遍历,在遍历时候同时计算序列化结果,注意最后一个没有逗号 反序列化其实也是使用了层序遍历 由于起
阅读全文
摘要:题目 513. 找树左下角的值 思路1(BFS 广度优先搜索) 本题用BFS好做,因为求得是最后一行的最左边的值 BFS广度优先搜索其实就是层序遍历 层序遍历是一层一层的遍历,我们只需要在每层遍历开始将最左边的数记录下来即可 遍历结束那个值就是结果了 代码 class Solution { publ
阅读全文
摘要:题目 129. 求根到叶子节点数字之和 思路1(DFS 深度优先搜索) 通过深度优先搜索,自顶向下 参数列表加了一个preSum参数,用于存储上父节点的数的大小 将preSum与本结点的val进行计算,得到一个结果,次结果作为下一个结点的父节点preSum参数,传递进去 如果遍历到空,就返回0 否则
阅读全文
摘要:在git使用中要如何取消commit但是还未push的操作? 通常,我们对修改的文件会先git add .,然后git commmit -m "注释",但是如果commit错了,想要取消commit而且还要保留已经add的文件,那么应该怎么做呢? 可以使用这个命令来取消commit: git res
阅读全文
摘要:题目 739. 每日温度 思路1(暴力破解) 遍历每一个元素,从他的后一个元素开始寻找比他大的元素,如果遇到的是比他小于等于的,那就跳过,继续往后找 如果找到最后一个都还没找到比他大的,那么就直接赋值为0 代码 class Solution { public int[] dailyTemperatu
阅读全文
摘要:题目 104. 二叉树的最大深度 思路1(递归) 自顶向下,利用递归 从子结构中择优,选择最大的那个 其实就是树的后序遍历 代码 class Solution { public int maxDepth(TreeNode root) { // 到底就开始返回 if (root == null) {
阅读全文
摘要:一、过滤器 Filter 1. 什么是过滤器? 过滤期正如我们生活中用来过滤东西的东西,泡茶喝,用纱网过滤茶叶一样。再web中,当我们浏览器访问服务器时候,浏览器所发送的请求会先经过过滤器被拦截下来,让过滤器来执行某些操作。在实际开发中,过滤器的常用用途有登录验证、统一编码处理、过滤敏感字符等等 2
阅读全文
摘要:LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。 LR
阅读全文
摘要:题目 146. LRU缓存机制 思路 利用双链表和HashMap来解题 看到链表题目,我们可以使用头尾结点可以更好进行链表操作和边界判断等 还需要使用size变量来存储双链表的当前长度 调用get,如果存在的话,我们可以调用将在双链表中的结点通过修改指针移动到第一个;如果调用put,我们先判断是否存
阅读全文
摘要:题目 160. 相交链表 思路1(暴力) 暴力遍历 当遍历其中一个链表每一个元素时,都将该元素和另一个链表的每一个元素进行比较,如果相等就相交。时间复杂度比较大。。。 代码 public class Solution { public ListNode getIntersectionNode(Lis
阅读全文
摘要:题目 109. 有序链表转换二叉搜索树 思路1(分治+前序) 二叉搜索树就是左孩子比根节点小,右孩子比根节点大,而且左右两个子树的高度差不大于1称为二叉搜索树 通过观察这个链表转换成的搜索树可以发现,根节点其实就是链表的中间的结点,左孩子就是左边一半链表的中间的结点,右孩子就是右边一半链表的中间的结
阅读全文
摘要:题目 2. 两数相加 思路 这个和445. 两数相加 II很像,而且比 445 的简单一点 如何控制位数不一样情况下计算?如果短的先到末尾了,但是长的那个还没到,那么我们可以先用0来代替短的那个值,结果是不影响的 当两个链表都到达末尾时候,但是carry,即进位是1,那么还需要再计算一次,将进位加上
阅读全文
摘要:题目 707. 设计链表 思路1(单链表) 用单链表来实现 用一个head作为头结点,不存储数据 再用size存储当前链表长度,防止操作时候越界 代码 class ListNode { int val; ListNode next; public ListNode(int val) { this.v
阅读全文
摘要:什么是单调栈? 单调栈实际上就是栈,只是限制要比普通的栈更严格而已了。要求是每次入栈的元素必须要有序(如果新元素入栈不符合要求,则将之前的元素出栈,直到符合要求再入栈),使之形成单调递增/单调递减的一个栈。 比如我们有一个数组: **单调递增栈:**只有比他小的才直接入栈,如果大于就先出栈再入栈(在
阅读全文
摘要:题目 768. 最多能完成排序的块 II 思路 利用单调递减栈来解题 遍历数组,将元素存入栈中,再利用max记录当前栈顶的最大值 如果遇到比当前栈元素大的值,那么可以直接入栈,因为可以单独分一块;但是如果遇到比当前栈顶元素小的值,那么应该将之前的元素依次出栈,直到遇到小于等于该值的元素停止出栈,然后
阅读全文
摘要:1、公钥密码体制的核心思想是 加密和解密采用不同的密钥。这是公钥密码体制和传统的对称密码体制最大的区别。对于传统对称密码而言,密文的安全性完全依赖于 密钥的保密性,一旦密钥泄漏,将毫无保密性可言。但是公钥密码体制彻底改变了这一状况。在公钥密码体制中,公钥是公开的,只有私钥是需要保密的。知道公钥 和密
阅读全文
摘要:题目 232. 用栈实现队列 思路1 即然是使用两个栈,那么一个栈就用来做辅助栈,一个栈用来存元素 我们将栈顶作为队头,将栈底作为队尾,所以如果要push数据的话,先将stack1栈的数据暂时存到stack2辅助栈中,然后将要插入的数据push进入stack1,最后再将stack2的暂存的数据填回到
阅读全文
摘要:题目 394. 字符串解码 思路 创建两个栈进行解题,一个用来存放数字,另一个用来临时存放子字符串 由于可能会在[]中还包含其他的[],所以我们只要遇到[就先将其前面的字符串暂时入栈,稍后再进行计算 如果遇到] ,则将存放数字的栈和存放子字符串的栈分别出栈一个,然后进行字符串的拼接,然后再将该字符串
阅读全文
摘要:题目 请你设计一个支持下述操作的栈。 实现自定义栈类 CustomStack : CustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容纳的元素数量,栈在增长到 maxSize 之后则不支持 push 操作。 void push(int x)
阅读全文
摘要:题目 821. 字符的最短距离 思路1 使用一个res数组,而且要初始化为Integer.MAX_VALUE 从左到右遍历字符串,直到遇到我们的目标字符时候停下来 以目标字符为中心,pre和next双指针向两边移动,并且给数组赋值,从1开始递增 如果指针再移动过程中遇到当前的值大于等于左边/右边的值
阅读全文
摘要:题目 给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少? 举个简单的例子,输入如下: N = 3, W = 4 wt = [2, 1, 3] val = [4, 2, 3] 算法
阅读全文
摘要:题目 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123。 示例 2: 输
阅读全文