训练营三期
滑动窗口
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/