训练营三期
滑动窗口
| 1 | 给定一个有序数组arr,从左到右依次表示X轴上从左往右点的位置 | 
| 1 | 解法一: | 
| 1 | //二分方法 | 
| 1 | //窗口滑动 | 
括号四连
| 1 | 括号有效配对是指: | 
| 1 | 问题一解法一: | 
| 1 | //解法二 | 
| 1 | //问题二解法: | 
| 1 | 括号有效配对是指: | 
| 1 | 思路: | 
| 1 | public static int maxLength(String s) { | 
| 1 | 给一个正确的括号字符:((()))()(())() ,判断该字符中括号最大嵌套了几层? | 
| 1 | public static int deep(String s) { | 
辅助数组
| 1 | 有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。 | 
| 1 | 思想: | 
| 1 | // RGRGR -> RRRGG | 
| 1 | 给定一个N*N的矩阵matrix,只有0和1两种值,返回边框全是1的最大正方形的边长长度。 | 
| 1 | 思想: | 
| 1 | //计算right down数组 | 
| 1 | 给定一个正整数M,请构造出一个长度为M的数组arr,要求 | 
| 1 | 思想: | 
| 1 | // 生成长度为size的达标数组 | 
| 1 | 给定一个二叉树的头节点head,路径的规定有以下三种不同的规定: | 
| 1 | //问题1: | 
| 1 | 第二问思路: | 
| 1 | public static class Info { | 
| 1 | //第三问: | 
| 1 | 在行也有序、列也有序的二维数组中,找num,找到返回true,否则false | 
| 1 | public static boolean isContains(int[][] matrix, int K) { | 
| 1 | 有n个打包机器从左到右一字排开,上方有一个自动装置会抓取一批放物品到每个打包机上 | 
| 1 | 思路: | 
| 1 | public static int MinOps(int[] arr) { | 
| 1 | 给定一个数组arr长度为N,你可以把任意长度大于0且小于N的前缀作为左部分,剩下的 作为右部分。 | 
| 1 | 思想: | 
| 1 | public static int maxABS3(int[] arr) { | 
单调性
| 1 | 给定一个数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器, 请返回容器能装多少水 | 
| 1 | 思路: | 
| 1 | //解法二 | 
| 1 | 如果给你一个二维数组,每一个值表示这一块地形的高度, | 
| 1 | 思路: | 
| 1 | public static class Node { | 
| 1 | public static int trapRainWater(int[][] heightMap) { | 
| 1 | 给定一个有序数组arr,给定一个正数aim | 
| 1 | 问题一思想: | 
| 1 | public static void printUniquePair(int[] arr, int k) { | 
| 1 | 问题二思想: | 
| 1 | public static void printUniqueTriad(int[] arr, int k) { | 
| 1 | 长度为N的数组arr,一定可以组成N^2个数值对。 | 
| 1 | 思想: | 
| 1 | 每种工作有难度和报酬,规定如下 | 
| 1 | 思想: | 
| 1 | 背包容量为w | 
| 1 | public static int ways1(int[] arr, int w) { | 
| 1 | //动态规划 | 
空间压缩

| 1 | 黄色:已知的点对应的值 | 
| 1 | 给定两个字符串str1和str2,求两个字符串的最长公共子串 | 
| 1 | 思想: | 
| 1 | //动态规划 + 空间压缩!!! | 
| 1 | 给定一个由字符串组成的数组String[] strs,给定一个正数K | 
| 1 | 思路: | 
| 1 | public static class Node { | 
| 1 | public static void printTopKAndRank(String[] arr, int topK) { | 
| 1 | 请实现如下结构: | 
| 1 | //自定义的堆结构 | 
| 1 | // str用户现在给我的 | 
| 1 | private void heapify(int index, int heapSize) { | 
| 1 | 给你一个字符串类型的数组arr,譬如: | 
| 1 | 思想: | 
| 1 | public static class Node { | 
| 1 | // folderPaths -> [ "a\b\c","a\b\s" , "a\d\e" ,"e\f\sty" ] | 
| 1 | 已知一棵二叉树中没有重复节点,并且给定了这棵树的中序遍历数组和先序遍历 数组,返回后序遍历数组。 | 
| 1 | 思路: | 
| 1 | public static int[] preInToPos2(int[] pre, int[] in) { | 
| 1 | 最长递增子序列问题的O(N*logN)的解法 | 
| 1 | O(N^2) 解法: | 
| 1 | //O(N * logN) | 
| 1 | 每个信封都有长和宽两个维度的数据,A信封如果想套在B信封里面,A信封必须在长和宽上都小于B信封才行。 | 
| 1 | 思路: | 
| 1 | public static class Envelope { | 
| 1 | public static Envelope[] getSortedEnvelopes(int[][] matrix) { | 
| 1 | 给定一个数组arr,返回子数组的最大累加和。 | 
| 1 | 思路: | 
| 1 | public static int maxSum(int[] arr) { | 
| 1 | 给定一个整型矩阵,返回子矩阵的最大累加和。 | 
| 1 | 思想: | 
| 1 | public static int maxSum(int[][] m) { | 
| 1 | 双向链表节点结构和二叉树节点结构是一样的,如果你把last认为是left,next认为是right的话。 | 
| 1 | // 整棵树,串成双向链表,返回头、尾 | 
| 1 | // 以x为头的整棵搜索二叉树,请全部以有序双向链表的方式,连好 | 
编辑距离
| 1 | 给定两个字符串str1和str2,再给定三个整数ic、dc和rc,分别代表插入、删除和替换一个字符的代价,返回将str1编辑成str2的最小代价。 | 
| 1 | 思路: | 
| 1 | public static int minCost1(String s1, String s2, int ic, int dc, int rc) { | 
| 1 | 给定两个字符串s1和s2,问s2最少删除多少字符可以成为s1的子串? | 
| 1 | 思路: | 
| 1 | // 解法一: | 
| 1 | // 解法二 | 
| 1 | 解法二的优化 | 
| 1 | public static int minCost3(String s1, String s2) { | 
| 1 | 求完全二叉树节点的个数,要求时间复杂度低于O(N) | 
| 1 | 思想: | 
| 1 | // 请保证head为头的树,是完全二叉树 | 
LRU
| 1 | (Least Recently Used)LRU内存替换算法的实现: | 
| 1 | public static class Node<K, V> { | 
| 1 | // 双向链表 | 
| 1 | public static class MyCache<K, V> { | 
图的遍历
| 1 | 给定两个字符串,记为start和to,再给定一个字符串列表list,list中一定包含to list中没有重复字符串,所有的字符串都是小写的。 | 
| 1 | 思路: | 
| 1 | public static List<List<String>> findMinPaths( | 
异或
| 1 | 一个数组的异或和是指数组中所有的数异或在一起的结果 | 
| 1 | 解法一:O(N^2) | 
| 1 | public static int maxXorSubarray1(int[] arr) { | 
| 1 | 解法二:O(N) | 
| 1 | public static int maxXorSubarray2(int[] arr) { | 
| 1 | // 前缀树的节点类型,每个节点向下只可能有走向0或1的路 | 
| 1 | 给定一个数组arr,哪一种划分下一个数组异或和为零的部分最多,返回最多能划分出几块异或和为零的部分 | 
| 1 | 思路:假设答案法 | 
| 1 | public static int mostEOR(int[] arr) { | 
| 1 | 给定一个只由 0(假)、1(真)、&(逻辑与)、|(逻辑或)和^(异或)五种字符组成 的字符串express | 
| 1 | 思路:假设答案法 | 
| 1 | //暴力递归 | 
| 1 | //动态规划 | 
| 1 | 给出一组正整数arr,你从第0个数向最后一个数, | 
| 1 | //动态规划 从左往右模型 | 
| 1 | 一个字符串至少切几刀,能让切出来的部分全是回文串 | 
| 1 | 思路: | 
| 1 | public static int minParts(String s) { | 
| 1 | 给定两个有序数组arr1和arr2,再给定一个正数K | 
| 1 | 思路: | 
| 1 | // 放入大根堆中的结构 | 
| 1 | public static int[] topKSum(int[] arr1, int[] arr2, int topK) { | 
| 1 | 给定一个正数数组arr,返回该数组能不能分成4个部分,并且每个部分的累加和相等,切分位置的数不要。 | 
| 1 | 思路: | 
| 1 | public static boolean canSplits2(int[] arr) { | 
| 1 | 给定三个字符串str1、str2和aim,如果aim包含且仅包含来自str1和str2的所有字符 | 
| 1 | 思路: | 
| 1 | public static boolean isCross1(String s1, String s2, String ai) { | 
| 1 | 给定一个无序数组arr,如果只能再一个子数组上排序 | 
| 1 | 思路: | 
| 1 | public static int getMinLength(int[] arr) { | 
| 1 | 给定一个正数数组 arr,其中所有的值都为整数,以下是最小不可组成和的概念: | 
| 1 | 问题一: | 
| 1 | // 已知arr中肯定有1这个数 | 
| 1 | 给定一个有序的正数数组arr和一个正数aim,如果可以自由选择arr中的数字,想累加得 到 1~aim 范围上所有的数,返回arr最少还缺几个数。 | 
| 1 | 思路: | 
| 1 | // arr请保证有序,且正数 | 
| 1 | 在一个字符串中找到没有重复字符子串中最长的长度。 | 
| 1 | 思路: | 
| 1 | public static int maxUnique(String str) { | 
| 1 | 一个数组中,如果两个数的公共因子有大于1的,则认为这两个数之间有通路 | 
| 1 | 思路: | 
| 1 | //求两个数的最大公约数,辗转相除法,背! | 
| 1 | //解法一: | 
| 1 | //解法三 | 
| 1 | 给定一个全是小写字母的字符串str,删除多余字符,使得每种字符只保留一个,并让 最终结果字符串的字典序最小 | 
| 1 | 贪心思路: | 
| 1 | // 在str中,每种字符都要保留一个,让最后的结果,字典序最小 ,并返回 | 
| 1 | 给定两个数组arrx和arry,长度都为N。代表二维平面上有N个点,第i个点的x 坐标和y坐标分别为arrx[i]和arry[i],返回求一条直线最多能穿过多少个点? | 
| 1 | 思路: | 
| 1 | public static int maxPoints(Point[] points) { | 
| 1 | int[] d,d[i]:i号怪兽的能力 | 
| 1 | // int[] d d[i]:i号怪兽的武力 | 
| 1 | 上面解法暴力递归能改动态规划,以index为行,hp为列的二维数组,value存储花费的钱数,但是如果hp很大,这个dp表会很大 | 
| 1 | public static long func3(int[] d, int[] p) { | 
| 1 | 给定一个字符串,如果可以在字符串任意位置添加字符,最少添加几个能让字符串整体都是回文串。 | 
| 1 | 思路: | 
| 1 | public static String getPalindrome1(String str) { | 
| 1 | 一种消息接收并打印的结构设计 | 
| 1 | public static class Node { | 
| 1 | 现有n1+n2种面值的硬币,其中前n1种为普通币,可以取任意枚,后n2种为纪念币, 每种最多只能取一枚,每种硬币有一个面值,问能用多少种方法拼出m的面值? | 
| 1 | 思路: | 
| 1 | public static int moneyWays(int[] arbitrary, int[] onlyone, int money) { | 
| 1 | 给定一个正数N,表示你在纸上写下1~N所有的数字 | 
| 1 | 思路: | 
| 1 | public static int solution2(int num) { | 
| 1 | 先给出可整合数组的定义:如果一个数组在排序之后,每相邻两个数差的绝对值 都为 1, 则该数组为可整合数组。例如,[5,3,4,6,2]排序之后为[2,3,4,5,6], 符合每相邻两个数差的绝对值 都为 1,所以这个数组为可整合数组。 给定一个整型数组 arr,请返回其中最大可整合子数组的长度。例如, [5,5,3,2,6,4,3]的最大可整合子数组为[5,3,2,6,4],所以返回 5。 | 
| 1 | 思路: | 
| 1 | public static int getLIL2(int[] arr) { | 
卡特兰数
| 1 | k(0) = 1, k(1) = 1时,如果接下来的项满足: | 
股票问题
| 1 | 题目一: | 
| 1 | public int maxProfit(int[] prices) { | 
| 1 | 题目二: | 
| 1 | 思路: | 
| 1 | public static int maxProfit(int[] prices) { | 
| 1 | 题目三: | 
| 1 | 思路: | 
| 1 | public static int dp(int K, int[] prices) { | 
最后更新: 2021年02月03日 17:23
原始链接: https://midkuro.gitee.io/2020/10/31/algorithm-trainingcamp3/
 
                