- 博客(653)
- 资源 (1)
- 收藏
- 关注
原创 2022.03.18 - NC071.BM101 设计LFU缓存结构
文章目录1. 题目2. 思路(1) 哈希表+优先队列3. 代码1. 题目2. 思路(1) 哈希表+优先队列哈希表count存储key和调用该key的次数和时间,哈希表data存储真正的数据,优先队列存储key,按照调用次数从小到大排序,调用次数相等时,按照调用时间从小到大排序。3. 代码import java.util.ArrayList;import java.util.HashMap;import java.util.PriorityQueue;public class Sol
2022-03-18 18:00:20
595
原创 2022.03.18 - NC070.BM100 设计LRU缓存结构
文章目录1. 题目2. 思路(1) 队列+哈希表3. 代码1. 题目2. 思路(1) 队列+哈希表利用队列维护key的淘汰顺序,每次get或set,若存在key,则将key从队列中删除,重新加入队尾。利用哈希表存储真实的key-value数据。3. 代码import java.util.HashMap;import java.util.LinkedList;import java.util.Map;import java.util.Queue;public class Tes
2022-03-18 10:01:57
438
1
原创 2022.03.17 - NC069.BM99 顺时针旋转矩阵
文章目录1. 题目2. 思路(1) 模拟法3. 代码1. 题目2. 思路(1) 模拟法首先按照反对角线翻转数组,再按照水平对称翻转数组即可。3. 代码public class Test { public static void main(String[] args) { }}class Solution { public int[][] rotateMatrix(int[][] mat, int n) { for (int i = 0; i &
2022-03-18 09:44:03
389
原创 2022.03.17 - NC068.BM97 旋转数组
文章目录1. 题目2. 思路(1) 双指针法3. 代码1. 题目2. 思路(1) 双指针法首先对整个数组进行旋转,然后分别对前m个元素的子数组和后n-m个元素的子数组进行旋转即可。3. 代码public class Test { public static void main(String[] args) { }}class Solution { /** * 旋转数组 * * @param n int整型 数组长度 *
2022-03-17 17:53:07
323
原创 2022.03.17 - NC067.BM96 主持人调度(二)
文章目录1. 题目2. 思路(1) 优先队列3. 代码1. 题目2. 思路(1) 优先队列先对活动时间按照开始时间从小到大排序,若开始时间相同,则按照结束时间从小到大排序。优先队列中存放的是之前活动的结束时间,若当前活动的开始时间大于等于最近一个活动的结束时间,则弹出该活动的结束时间,即让该活动的主持人继续主持当前活动。3. 代码import java.util.Arrays;import java.util.PriorityQueue;public class Test {
2022-03-17 10:52:34
625
原创 2022.03.17 - NC066.BM95 分糖果问题
文章目录1. 题目2. 思路(1) 贪心算法3. 代码1. 题目2. 思路(1) 贪心算法先从左往右遍历,若arr[i]>arr[i-1],则sum[i]=sum[i-1]+1,否则sum[i]=1,初始时sum[0]=1。再从右往左遍历,若arr[i]>arr[i+1],则sum[i]=max(sum[i],sum[i+1]+1),否则sum[i]=max(sum[i],1),同时统计所有糖果的数量。3. 代码public class Test { public s
2022-03-17 10:06:44
546
原创 2022.03.16 - NC065.BM94 接雨水问题
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划dp[i]表示下标i左边最高的柱子的高度,从左往右遍历数组后,计算出所有的dp[i]。再从右往左遍历数组,维护一个右边最高的柱子的高度,对于下标i,其能存储的雨水的体积是max(min(dp[i],max)-arr[i],0)。3. 代码public class Test { public static void main(String[] args) { }}class So
2022-03-16 20:01:23
219
原创 2022.03.16 - NC064.BM93 盛水最多的容器
文章目录1. 题目2. 思路(1) 双指针法3. 代码1. 题目2. 思路(1) 双指针法利用双指针法从两侧向内缩小区间,寻找最大容量。无论是短板还是长板向内移动,底边的长度都会减1,若短板向内移动,则短板可能变长,容量可能增加;若长板向内移动,由于短板不变,容量一定缩小,因此,每次都选择短板向内移动。3. 代码public class Test { public static void main(String[] args) { }}class Solutio
2022-03-16 13:29:30
153
原创 2022.03.16 - NC063.BM92 最长无重复子数组
文章目录1. 题目2. 思路(1) 模拟法3. 代码1. 题目2. 思路(1) 模拟法利用HashSet存储当前左右指针区间内的元素,维护一个全局最长无重复子数组的长度即可。3. 代码import java.util.HashSet;import java.util.Set;public class Test { public static void main(String[] args) { }}class Solution { /** *
2022-03-16 11:48:59
167
原创 2022.03.16 - NC062.BM90 最小覆盖子串
文章目录1. 题目2. 思路(1) 模拟法3. 代码1. 题目2. 思路(1) 模拟法利用HashMap存储各个字符的数量,利用双指针法统计包含所有字符的区间,若区间长度小于最小长度,则更新最小覆盖子串。3. 代码import java.util.HashMap;public class Test { public static void main(String[] args) { }}class Solution { /** * @param
2022-03-16 11:32:36
185
原创 2022.03.16 - NC061.BM89 合并区间
文章目录1. 题目2. 思路(1) 模拟法3. 代码1. 题目2. 思路(1) 模拟法首先按照start对区间进行排序,然后遍历区间,同时维护前一个区间的start和end。若当前区间的start<=前一个区间的end,则将当前区间与前一个区间合并,并更新前一个区间的end;否则,将前一个区间加入结果集,同时更新start和end。3. 代码import java.util.ArrayList;import java.util.Collections;public class
2022-03-16 10:29:19
237
原创 2022.03.15 - NC060.BM86 大数加法
文章目录1. 题目2. 思路(1) 模拟法3. 代码1. 题目2. 思路(1) 模拟法从低位开始模拟相加,记录进位的大小,加到高一位的结果中。3. 代码public class Test { public static void main(String[] args) { }}class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * *
2022-03-15 10:39:36
159
原创 2022.03.15 - NC059.BM85 验证IP地址
文章目录1. 题目2. 思路(1) 模拟法3. 代码1. 题目2. 思路(1) 模拟法首先区分出是IPv4还是IPv6,然后根据各自的规则进行判断即可。3. 代码import java.util.HashSet;import java.util.Set;public class Test { public static void main(String[] args) { }}class Solution { /** * 验证IP地址
2022-03-15 10:27:39
216
原创 2022.03.14 - NC058.BM82 买卖股票的最好时机(三)
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划dp[i][0]表示第i天完成第一次买入股票的总收益,dp[i][1]表示第i天完成第一次卖出股票的总收益,dp[i][2]表示第i天完成第二次买入股票的总收益,dp[i][3]表示第i天完成第二次卖出股票的总收益。对于每一种状态,要么是前一天完成了该状态,今天什么都不做;要么是前一天完成了前一个状态,今天完成了该状态。3. 代码public class Test { public sta
2022-03-14 22:39:48
235
原创 2022.03.14 - NC057.BM81 买卖股票的最好时机(二)
文章目录1. 题目2. 思路(1) 贪心算法3. 代码1. 题目2. 思路(1) 贪心算法如果今天的价格高于昨天的价格,那么就昨天买入今天卖出。3. 代码public class Test { public static void main(String[] args) { }}class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算最大收益 *
2022-03-14 21:43:28
236
原创 2022.03.14 - NC056.BM79 打家劫舍(二)
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划当最后一家和第一家连起来后,从整体来看,要么不偷最后一家,偷第一家;要么偷最后一家,不偷第一家。分别计算区间为[1,n-1]的dp[n-1]和区间为[2,n]的dp[n],返回较大值。3. 代码public class Test { public static void main(String[] args) { }}class Solution { /**
2022-03-14 21:35:29
249
原创 2022.03.14 - NC055.BM78 打家劫舍(一)
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划dp[i]表示在前i个房间能偷到的最大金额。对于第i-1家,要么不偷,要么偷,因此,dp[i]=max(dp[i-1],dp[i-2]+nums[i-1])。3. 代码public class Test { public static void main(String[] args) { }}class Solution { /** * 代码中的类名、方法名、
2022-03-14 21:24:23
792
原创 2022.03.14 - NC054.BM77 最长的括号子串
文章目录1. 题目2. 思路(1) 栈3. 代码1. 题目2. 思路(1) 栈栈中存放的是左括号的下标,若遇到右括号,则弹出与其匹配的最近的左括号,同时更新匹配的长度。3. 代码import java.util.Deque;import java.util.LinkedList;public class Test { public static void main(String[] args) { }}class Solution { /**
2022-03-14 13:06:02
194
原创 2022.03.13 - NC053.BM76 正则表达式匹配
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划dp[i][j]表示str中前i个字符的子串和pattern中前j个字符的子串是否匹配。重点在于当pattern[j-1]=’*'时的情况,若str[i-1]=pattern[j-2],则dp[i][j]=dp[i-1][j]||dp[i][j-2]。3. 代码public class Test { public static void main(String[] args) {
2022-03-13 16:29:40
275
原创 算法总结 - 002.排序
文章目录0. 排序1. 快速排序2. 归并排序3. 堆排序4. 代码0. 排序常用的排序有快速排序、归并排序、堆排序。下面列出各个排序所包含的方法,便于记忆。1. 快速排序sort(int[] arr)sort(int[] arr, int left, int right)2. 归并排序sort(int[] arr)sort(int[] arr, int left, int right)merge(int[] arr, int left, int mid, int right)
2022-03-11 11:17:00
159
原创 2022.03.11 - NC052.BM75 编辑距离(一)
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划题目中的3种操作可以转化为:向str1中插入一个字符;向str2中插入一个字符;修改str1中的一个字符。dp[i][j]表示str1的前i个字符的子串转化为str2的前j个字符的子串所需的最少操作数。若chars1[i-1]=chars2[j-1],则dp[i][j]=dp[i-1][j-1];否则,根据上面的3种操作,要么去掉chars1[i-1],向str1中插入chars2[j-1
2022-03-11 10:30:28
168
原创 2022.03.10 - NC051.BM74 数字字符串转化成IP地址
文章目录1. 题目2. 思路(1) 回溯法3. 代码1. 题目2. 思路(1) 回溯法利用回溯法找出符合条件的四个子字符串,每个子字符串的长度为[1,3],数值大小为[0,255],且要保证四个子字符串正好用完所有字符,不能多也不能少。若某个子字符串的第一位是0,则直接跳到下一个子字符串。3. 代码import java.util.ArrayList;public class Test { public static void main(String[] args) {
2022-03-10 17:07:27
187
原创 2022.03.10 - NC050.BM73 最长回文子串
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划dp[i][j]表示下标为[i,j]的子串是否是回文串。若子串两端的字符相等,且中间的子串是回文串,则该子串也是回文串,同时维护一个全局变量,表示最长回文子串的长度。外层循环从后往前遍历,内层循环从前往后遍历,保证子串内的任意子串已经被判断过。3. 代码public class Test { public static void main(String[] args) { }}
2022-03-10 11:32:34
107
原创 2022.03.10 - NC049.BM71 最长上升子序列(一)
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划dp[i]表示以下标i结尾的子数组的最长严格上升子序列的长度,每计算一个dp[i],都需要将arr[i]与前面每一个元素进行比较,若大于,则更新dp[i],同时维护一个全局最长的长度。3. 代码public class Test { public static void main(String[] args) { }}class Solution { /** *
2022-03-10 10:41:02
152
原创 2022.03.10 - NC048.BM69 把数字翻译成字符串
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划dp[i]表示下标为[0,i)的子字符串的译码数,分别处理四种状态转移的情况即可。3. 代码public class Test { public static void main(String[] args) { }}class Solution { /** * 解码 * * @param nums string字符串 数字串 *
2022-03-10 10:15:14
261
原创 2022.03.09 - NC047.BM68 矩阵的最小路径和
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划由于只能从(i-1,j)或者(i,j-1)到达(i,j),因此,dp[i][j]+=Math.min(dp[i-1][j],dp[i][j-1])。初始化时,第一列和第一行的单元格只能从一个方向到达,直接计算即可。3. 代码public class Test { public static void main(String[] args) { }}class Solution
2022-03-09 22:58:01
99
原创 2022.03.09 - NC046.BM66 最长公共子串
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划dp[i][j]表示str1中以下标i-1结尾的子字符串和str2中以下标j-1结尾的子字符串的最长公共子串。若chars1[i-1]==chars2[j-1],则dp[i][j]=dp[i-1][j-1]+chars1[i-1],同时,更新全局最长公共子串;否则,dp[i][j]=""。3. 代码public class Test { public static void main(Str
2022-03-09 17:30:17
234
原创 2022.03.09 - NC045.BM65 最长公共子序列(二)
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划dp[i][j]表示s1中下标为[0,i)的子字符串与s2中下标为[0,j)的子字符串的最长公共子序列。若chars[i-1]==chars[j-1],则dp[i][j]=dp[i-1][j-1]+chars[i-1];否则,dp[i][j]取dp[i-1][j]和dp[i][j-1]中较长的一个。3. 代码public class Test { public static void mai
2022-03-09 09:46:07
1041
原创 2022.03.08 - NC044.BM61 矩阵最长递增路径
文章目录1. 题目2. 思路(1) 回溯3. 代码1. 题目2. 思路(1) 回溯利用深度优先搜索遍历所有路径,若要从当前单元格跳到下一个单元格,则将当前单元格的值置为相反数,回溯时再次置为相反数。3. 代码public class Test { public static void main(String[] args) { }}class Solution { public int res; /** * 代码中的类名、方法名、参数名已
2022-03-08 17:44:55
332
原创 2022.03.08 - NC043.BM60 括号生成
文章目录1. 题目2. 思路(1) DFS3. 代码1. 题目2. 思路(1) DFS由于每个位置上不是左括号就是右括号,因此,可以利用深度优先搜索遍历出所有结果。对于一个合法组合,其任意前缀的左括号数量大于等于右括号数量。3. 代码import java.util.ArrayList;public class Test { public static void main(String[] args) { }}class Solution { /**
2022-03-08 14:54:39
146
原创 2022.03.08 - NC042.BM59 N皇后问题
文章目录1. 题目2. 思路(1) 回溯+HashSet3. 代码1. 题目2. 思路(1) 回溯+HashSet利用回溯遍历所有可能,利用HashSet存储已放置皇后的列、正对角线、反对角线,正对角线用row+col唯一标识,反对角线用row-col唯一标识。3. 代码import java.util.HashSet;public class Test { public static void main(String[] args) { }}class Solu
2022-03-08 09:53:19
127
原创 2022.03.08 - NC041.BM58 字符串的排列
文章目录1. 题目2. 思路(1) 回溯+HashSet3. 代码1. 题目2. 思路(1) 回溯+HashSet利用回溯遍历全排列的结果,利用HashSet去重。3. 代码import java.util.ArrayList;import java.util.HashSet;public class Test { public static void main(String[] args) { }}class Solution { public Ar
2022-03-08 09:33:25
143
原创 2022.03.07 - NC040.BM57 岛屿数量
文章目录1. 题目2. 思路(1) DFS3. 代码1. 题目2. 思路(1) DFS每发现一块陆地,对其进行深度优先搜索,将与其相连的’1’全部修改成’0’。3. 代码public class Test { public static void main(String[] args) { }}class Solution { /** * 判断岛屿数量 * * @param grid char字符型二维数组 * @ret
2022-03-07 21:49:53
257
原创 2022.03.07 - NC039.BM56 有重复项数字的全排列
文章目录1. 题目2. 思路(1) 回溯3. 代码1. 题目2. 思路(1) 回溯利用mask数组标记每个元素是否被选取,若某个数已经被选取,或者该数与前一个数相等且前一个数未被选取,则此次选取跳过该数。当某个数与前一个数相等且前一个数未被选取时,说明此次选择已经是从后往前选取了,出现了重复情况。3. 代码import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;public cl
2022-03-07 19:52:09
93
原创 2022.03.07 - NC038.BM55 没有重复项数字的全排列
文章目录1. 题目2. 思路(1) 回溯3. 代码1. 题目2. 思路(1) 回溯利用回溯+交换元素实现全排列。3. 代码import java.util.ArrayList;public class Test { public static void main(String[] args) { }}class Solution { public ArrayList<ArrayList<Integer>> permute(int[]
2022-03-07 19:20:21
66
原创 2022.03.07 - NC037.BM54 三数之和
文章目录1. 题目2. 思路(1) 双指针法3. 代码1. 题目2. 思路(1) 双指针法首先对数组进行快速排序,然后遍历数组,确定a值后,利用双指针法从后面数组的两端开始往中间移动,找到使a+b+c=0的元素。注意找到后不能直接返回,中间可能还有其他答案,需要继续移动。3. 代码import java.util.ArrayList;import java.util.Arrays;public class Test { public static void main(Str
2022-03-07 15:38:12
142
原创 2022.03.07 - NC036.BM53 缺失的第一个正整数
文章目录1. 题目2. 思路(1) 哈希表3. 代码1. 题目2. 思路(1) 哈希表利用原数组作为哈希表,若出现正整数m,则将下标为m-1的元素置为负数。对于数组中原来的负数,需要先遍历一遍数组,将所有小于等于0的元素全部置为n+1。再次遍历数组时,需要先对元素取绝对值,若其绝对值的范围是[1,n],则表示该元素是被其他元素置为负数的,即该下标上存在对应的正整数i+1。最后遍历数组时,若存在大于0的元素,则表示正整数i+1不存在,否则,不存在的最小正整数是n+1。3. 代码publ
2022-03-07 15:12:53
112
原创 2022.03.07 - NC035.BM52 数组中只出现一次的两个数字
文章目录1. 题目2. 思路(1) 位运算3. 代码1. 题目2. 思路(1) 位运算将所有数字进行异或运算,结果即为两个只出现一次的数字进行异或运算的结果。找出该结果中任意一位值为1的二进制位,根据该二进制位,可以将所有数字分为两组,两个只出现一次的数字必定各在一组,其他数字必定两两出现在某一组。分别对两组中所有数字进行异或运算,即可得到两个只出现一次的数字。3. 代码public class Test { public static void main(String[] a
2022-03-07 09:57:26
128
原创 2022.03.06 - NC034.BM49 表达式求值
文章目录1. 题目2. 思路(1) 栈3. 代码1. 题目2. 思路(1) 栈利用一个栈存放操作数,另一个栈存放操作符。若遇到左括号,则直接压入操作符栈中;若遇到右括号,则弹出操作符栈的栈顶元素,以及两个操作数栈的栈顶元素进行计算,结果压入操作数栈中,如此循环,直到操作符栈的栈顶元素是左括号,则直接弹出即可。若遇到数字,则直接压入操作数栈中。若遇到操作符,可以先判断操作符栈的栈顶元素的优先级是否大于或等于当前操作符,若大于或等于,则可以先将之前的操作计算出来,然后再将操作符压入操作符栈中。
2022-03-06 22:40:13
292
原创 2022.03.06 - NC033.BM48 数据流中的中位数
文章目录1. 题目2. 思路(1) 堆排序3. 代码1. 题目2. 思路(1) 堆排序每次加入新元素,都对原列表进行堆排序。要对列表进行从小到大的排序,需要构建大顶堆,然后不断将堆顶元素交换到后面即可。3. 代码import java.util.ArrayList;import java.util.List;public class Test { public static void main(String[] args) { }}class Solution
2022-03-06 10:56:52
106
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人