- 博客(80)
- 收藏
- 关注
原创 个人博客网站 https://gaoyi-ai.gitee.io/archives/
博客迁移 现在博客都更新在gitee上,地址:https://gaoyi-ai.gitee.io/note-site
2020-12-18 20:46:39
2337
2
原创 HashMap - 哈希表
文章目录TreeMap分析HashMaphashLong和Double的哈希值字符串的哈希值关于31的探讨扰动计算自定义对象作为keyHash CollisionJDK1.8的哈希冲突解决方案putcontainsKeycontainsValue扩容 TreeMap分析 内部通过红黑树实现节点存储Entity映射 ◼ 时间复杂度(平均) 添加、删除、搜索:O(logn) ◼ 特点 Key 必须具备可比较性 元素的分布是有顺序的 ◼ 在实际应用中,很多时候的需求 Map 中存储的元素不需要讲究顺序
2020-07-16 20:55:56
618
原创 Assembly-Lab 9
文章目录实验要求code 实验要求 code assume cs:code,ds:data,ss:stack data segment str db 'welcome to masm!' c db 2,24h,71h data ends stack segment db 16 dup (0) stack ends code segment start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,16 mov a
2020-07-14 16:57:11
351
原创 Assembly-Lab 8
文章目录实验8实验分析汇编编译器(masm.exe)对jmp的相关处理 实验8 分析下面程序,这个程序可以正确返回吗? assume cs:codesg codesg segment mov ax,4c00h int 21h start: mov ax,0 s: nop nop mov di,offset s mov si,offset s2 mov ax,cs:[si] mov cs:[di],ax s0: jmp s
2020-07-14 12:43:24
256
原创 DNA.动态规划
文章目录dp.DNA dp.DNA DNA can be modeled as a string consisting of letters A,T,G and C, denoting the four different nitrogen bases. To measure genetic similarity, we want to identify non-overlapping substrings that match given non-empty sequences, each of which
2020-07-06 08:54:39
343
原创 collapse.动态规划
题目分析 from building import * def max_food(building: Building) -> int: """returns the maximum number of food that can be collected from given building""" length = 2 * building.size + 1 dp = [[0 for i in range(length)] for j in range(length
2020-06-02 08:55:38
532
原创 OSPF与RIP协议对比
文章目录OSPF路由规划拓扑OSPF与RIP协议对比 OSPF路由规划拓扑 OSPF与RIP协议对比 显然,根据RIP协议,10.0.0.1 向 40.0.0.1 发送ICMP请求会 选择 10.0.0.0 -> 192.168.0.0 -> 40.0.0.0 路径(依据跳步数最少) 然而,根据OSPF协议,依据路径向量选择会决策代价(cost) Cisco路由器判断代价为 100M带宽/链路带宽(小于1则取1) 选择 10.0.0.0 -> 20.0.0.0 -> 30.0.
2020-05-21 21:12:12
1448
原创 0-1背包
文章目录题目分析Solution - 二维数组Solution - 一维数组变式题 - 恰好装满Solution 题目分析 假设dp(i,j)是最大承重为j、有前i件物品可选时的最大总价值,i∈[1,n],j∈[1,W] dp(i,0)、dp(0,j)初始值均为0 如果j< weights[i-1],那么dp(i,j)=dp(i-1,j) 如果j≥ weights[i-1],那么dp(i...
2020-05-20 19:03:40
267
原创 42.接雨水
42.接雨水 文章目录题目分析Solution 题目分析 Solution /** * 空间复杂度O(1),时间复杂度O(n) */ public int trap(int[] height) { if (height == null || height.length == 0) return 0; int lastIdx = height.length - 2; // 遍历每一根柱子,看看每一根柱子上能放多少水
2020-05-14 17:21:25
231
原创 11.盛最多水的容器
11.盛最多水的容器 文章目录题目分析Solution 题目分析 暴力法:枚举可能的两个柱子,但是会有较多的无效计算 优化 Solution public int maxArea(int[] height) { if (height == null || height.length == 0) return 0; int l = 0, r = height.length - 1, water = 0; while (l < r) {
2020-05-14 16:21:26
138
原创 253.会议室II
253.会议室II 文章目录题目分析Solution - 最小堆Solution - 分开排序 题目分析 按照常识,要根据开始时间来排序,先开的排在前面 前面有会议开完,则可以利用该会议室;否则,要新开一间会议室 Solution - 最小堆 最小堆,取最小值:O(1);插入,删除:O(logn) 堆顶:最早开的会的结束时间,这样要开的会的开始时间和最早结束的会议的结束时间比较 最后堆中,剩下的元素个数为所需要的会议室,即没有在要开的会了 public int minMeetingRooms(in
2020-05-13 22:36:12
452
原创 7.整数反转
7.整数反转 文章目录题目分析Solution 题目分析 假设最大值就为2789,那它反转之后为9872,一定会溢出 b = a * 10 + x % 10 ; (b - x % 10) / 10 = a,反推a,能相等说明没有溢出,因为溢出数字就一定会变得不同 Solution public int reverse1(int x) { long res = 0; while (x != 0) { res = res * 10 + x %
2020-05-13 22:16:01
116
原创 146.LRU缓存机制
146.LRU缓存机制 文章目录题目分析Solution 题目分析 LRU是操作系统常用的一种页面置换算法,选择最近最久未使用的页面予以淘汰 虚拟头尾节点 哈希表+双向链表 Solution public class LRUCache { private Map<Integer, Node> map; private int capacity; // 虚拟头结点 private Node first; // 虚拟尾结点 private Nod
2020-05-13 22:03:17
250
原创 54.螺旋矩阵
54.螺旋矩阵 文章目录题目分析Solution 题目分析 先加最外一圈,一层一层向内,利用四个指针来确定处在哪一圈 矩阵分为偶数行和奇数行两种情况 奇数行、偶数列的时候有问题,当添加完left top -> right top,top++之后,top越过bottom 但是第二步right top -> right bottom不会执行,right– 但是第三步right bottom -> left bottom会在执行一次,所以要break Solution publi
2020-05-13 21:44:31
295
原创 面试题.62.圆圈中最后剩下的数字
面试题.62.圆圈中最后剩下的数字 文章目录题目分析Solution 题目分析 约瑟夫环问题 f(n, m) = (f(n – 1, m) + m) % n 如果编号从1开始,即结果+1,向后一个 Solution public int lastRemaining1(int n, int m) { return (n == 1) ? 0 : (lastRemaining1(n - 1, m) + m) % n; } // f(1, 3) = 0 //
2020-05-13 21:24:56
204
原创 50.Pow
50.Pow 文章目录Solution - 递归Solution - 非递归变式题 - 快速幂的模 Solution - 递归 这里注意-1右移,-1 = 1111 1111,右移仍然是 1111 1111 = -1 320 = 310 * 310 ; 321 = 310 * 310 * 3 3-20 = 3-10 * 3-10 ; 3-20 = 3-11 * 3-11 * 3 负奇数,右移相当于绝对值向上取整, 指数 -7 >> 1 == -4 * -4 * 4 // T(n) =
2020-05-13 21:14:11
183
原创 15.三数之和
15.三数之和 文章目录题目分析Solution 题目分析 去重:由于是经过排序的,那么相等的一定是挨在一起的,2位置的-1,他只向他后面找能组合成功的数,但是1位置的-1已经找过了,并且1位置,他找的范围还要更大,也就是2位置时其实是可以跳过的 l,r 如果扫描到和前一次的元素相等,即重复情况就要跳过 Solution public List<List<Integer>> threeSum(int[] nums) { if (nums == null
2020-05-13 18:30:20
173
原创 1.两数之和
1.两数之和 文章目录题目分析Solution 题目分析 暴力法枚举每一对相加之和,时间复杂度:O(n2) 要求O(n),即扫描到一个就能花O(1)时间找到另一个加数,即用哈希表 HashMap的key为数,value为下标,如果找到即返回,找不到,就把自己加进去作为另一个加数 Solution public int[] twoSum(int[] nums, int target) { if (nums == null) return null; // 用来存放
2020-05-13 18:06:10
181
原创 283.移动零
283.移动零 文章目录题目分析Solution 题目分析 不能考虑遇到0直接和数组末尾交换,这样会破环相对顺序 反过来想,把0移动到数组末 == 把非0移动到前面 一趟扫描,遇到0就跳过,遇到非0就把它挪到前面去 cur记录着可以挪动到的位置 注意当nums[i] != 0,且cur和i指向同位置,即非0数看作已经放好位置了 Solution public void moveZeroes(int[] nums) { if (nums == null) return;
2020-05-13 17:56:30
184
原创 39.组合总和
39.组合总和 文章目录题目分析Solution 题目分析 排序可以保证选择的数字,当超过remain时,一定凑不出,可以提前结束 dfs的退出条件显然为凑过target Solution class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { if (candidates == null || candidates.length
2020-05-08 22:29:07
188
原创 113.路径总和Ⅱ
113.路径总和Ⅱ 文章目录题目分析Solution 题目分析 此题dfs终止的条件是,到达叶子节点,但是找到节点的条件还要是remain为0 Solution class Solution { public List<List<Integer>> pathSum(TreeNode root, int sum) { List<List<Integer>> list = new ArrayList<>();
2020-05-08 22:05:44
131
原创 22.括号生成
22.括号生成 文章目录题目分析Solution 题目分析 这个题就不是直接明显的告诉层数,那么一定有2n个括号可以选择 比较特殊的是 ‘(’,一开始只能选择 ’(‘ ,并且此时’(‘可选的数量和’)'数量相同 如下图,此时剩余’(‘可选的数量和’)‘数量都为1,只可选择’(’ 为了记录剩余’(‘和’)'的数量,每次都要判断leftRemain和rightRemain 由于加入的’(‘还是’)'是有条件的,那么就不好用for循环,对左右括号分别判断即可 Solution public List<
2020-05-08 21:49:43
126
原创 47.全排列Ⅱ
47.全排列Ⅱ 文章目录题目分析Solution 题目分析 首先这个题和46.全排列不同于给的nums可能会有重复数字,这就导致产生的全排列会相同 比如[1,1,2]和 [1,3,2]这样1会替换3,导致出现相同的 去重: 第0层的第2,4,5其实是一样的,虽然后面不一样,但是最终全排列,后面的出现的情况最终还是一样 1位置和3,4位置交换时,由于前面已经和1交换过了,那么就会重复 Solution public List<List<Integer>> permuteU
2020-05-08 21:34:36
194
原创 46.全排列
46.全排列 文章目录题目分析SolutionSolution 2 题目分析 dfs 需要一层一层地来,画一个竖的表格 记录每一层干什么;记录结束时的条件 注意用过的就不能再选了,所以要记录每次要添加的列表,判断如果要加入的元素已经在其中,就直接跳过 当添加完一种情况后,注意把记录使用过的,在标记为没用过 Solution private List<List<Integer>> list; private int[] nums; /** 用来保存每一
2020-05-08 19:04:52
134
原创 242.有效的字母异位词
242.有效的字母异位词 文章目录题目分析Solution 题目分析 使用HashMap有点过于庞大,由于都是英文小写字母,所以直接开个数组就行 也可对s和t排序 Solution public boolean isAnagram(String s, String t) { if (s == null || t == null) return false; char[] sch...
2020-05-07 18:35:12
123
原创 572.另一个树的子树
572.另一个树的子树 文章目录题目分析Solution 题目分析 一般做法,对二叉树进行遍历,比如先序遍历,如果找到一样的根节点,那么就去找它的左子树和右子树是否相同 这里使用了二叉树的序列化,利用字符串进行解决 其实使用了contains 为什么要把空结点也表示?不表示空节点会导致有无数个二叉树 附:前序遍历踩坑 (12!#!#!) contains (2!#!#!) 只要再加上...
2020-05-07 18:29:19
131
原创 面试题01.09.字符串轮转
面试题01.09.字符串轮转 文章目录题目分析Solution 题目分析 这道题还挺有意思的 首先,旋转字符串的特点是,某些字符从后面跑到了前面,这就好像由一队变两队,队尾变成了队头 Solution public static boolean isRevolving(String s1, String s2) { if (s1 == null || s2 == null) re...
2020-05-07 18:12:56
364
原创 最长公共子串
文章目录题目分析Solution - 二维数组Solution - 一维数组 题目分析 假设2个字符串分别是str1、str2 i∈[1,str1.length] j∈[1,str2.length] 假设dp(i,j)是以str1[i-1]、str2[j-1]结尾的最长公共子串长度 dp(i,0)、dp(0,j)初始值均为0 如果str1[i-1]=str2[j-1],那么dp(i,j)=dp...
2020-05-07 10:25:49
1517
原创 739.每日温度
739.每日温度 文章目录题目分析Solution递减栈dp 题目分析 相当于寻找右边第一个比它大的位置,维持一个递减栈,存放索引 输出链表中有几个位置的值已经知道: 最右边第一个一定为0,从这就可以看出类似dp,因为温度不会再变化 所以可以直接从倒数第二个开始,记录当前和它的右边 当前温度<右边温度 天数=索引位置的差值 当前 = 右边 (把当前看成右边位置处...
2020-05-05 15:46:24
197
原创 654.最大二叉树及变式
654.最大二叉树 文章目录题目分析Solution变式题题目分析Solution 题目分析 很容易想到首先比较找出最大值作为根节点,递归找出根节点的左子树的根节点和右子树的根节点 Solution public TreeNode constructMaximumBinaryTree(int[] nums) { if (nums == null) return null; ...
2020-05-05 15:44:39
138
原创 155.最小栈
155.最小栈 文章目录题目分析Solution - minStackSolution - LinkedList 题目分析 如何能实现O(1)的返回最小值: 维护一个存放最小值的栈minStack,每次push时,就比较栈顶,把较小的再push到最小栈中,这样stack中每一个元素都对应着以它为栈顶时的一个最小值 Solution - minStack public class MinStac...
2020-05-04 22:54:47
129
原创 234.回文链表
234.回文链表 文章目录题目分析Solution 题目分析 中间节点:利用快慢指针,快指针每次走两步,慢指针每次走一步,当发现快指针的next或者next.next为空,意味着快指针已经走完链表,那么满指针正好位于中间位置 反转链表:熟记!!! 整体流程: 走到中间结点:反转右边的链表 分别从左边头结点和右边头结点开始,判断是否相等,当右边指向null时,中间结点要么被比较为相等,要么为奇...
2020-05-04 22:32:24
134
1
原创 239.滑动窗口最大值
239.滑动窗口最大值 文章目录题目分析双端队列最大索引Solution - DequeSolution - maxIndex 题目分析 暴力法的时间复杂度为 O(n*k),弊端为每次扫描窗口的最大值,每两次扫描之间都会存在重复的值比较,已经知道了他们的最大值是谁了,所以要减少比较次数 双端队列 为什么要使用双端队列(单调队列) 队列里要是滑动窗口范围的,当队列里的索引不再滑动窗口大的范围,...
2020-05-04 12:13:33
464
原创 86.分割链表
86.分割链表 文章目录题目分析Solution 题目分析 把它分割成两个单独链表,最后再串起来 如果说分割成三部分小于、相等、大于,也是相同思路 特殊情况分析: Solution public ListNode partition(ListNode head, int x) { if (head == null) return null; ListNode lHead = new ...
2020-05-03 21:48:36
129
原创 160.相交链表
160.相交链表 文章目录题目分析Solution 题目分析 当两个链表长度相等时,比较到相同的对象时,即交叉点 要满足所有情况下长度都相等,需要互相拼接,才会长度一定相等 Solution public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB =...
2020-05-03 21:28:07
149
原创 203.移除链表元素
203.移除链表元素 文章目录题目分析Solution 题目分析 把它想像成构建一个全新的链表,不等于val的,即是属于全新链表的结点 构造虚拟头节点 Solution public ListNode removeElements(ListNode head, int val) { if (head == null) return null; // 新链表的头结点 ListN...
2020-05-03 20:50:39
114
原创 面试题16.部分排序
寻找未排序的部分 == 寻找逆序对,且最远的逆序对 最右边位置:最右逆序对的位置 最左边位置:从右往左的逆序对 左 --> 右 扫描过的最大值是:8 如果发现当前值小于最大值,记录它的位置(2) 右 --> 左 扫描过的最小值是:1 如果发现当前值大于最小值,记录它的位置(5) 并且当 r == -1 时,即说明没有逆序对,直接返回 [-1,-1] ...
2020-05-01 21:25:49
238
原创 面试题47.礼物的最大价值
面试题47.礼物的最大价值 文章目录题目分析solution 题目分析 由于只能向右向下,则可以初始化第一行和第一列为对应的累加和 题解对应着走到右下角的价值 solution public int maxValue(int[][] grid) { int rows = grid.length; int cols = grid[0].length; ...
2020-05-01 21:19:26
260
原创 5.最长回文子串(四种方法)
文章目录Solution 1 - 动态规划Solution 2 - 中心扩展Solution 3 - 中心扩展优化Solution 4 - Manacher Solution 1 - 动态规划 dp[i][j]表示为s[i,j]是否为回文串;注意单字符一定为回文串,那么dp表格的对角线就可以预先填上 当s长度小于等于2时,s是否为回文串,只需要判断s[i]和s[j]是否相等 当s长度大于2时,...
2020-05-01 21:06:29
8584
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人