自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 2.7 字符串-最小包含子串的长度

Q: 给定字符串str1 和 str2 ,求str1的子串中含有str2所有字符的最小长度 分析: 1)在str1中找到含有str2所有字符的子串,首先这个子串长度一定 >= Str2.length。考虑用一个 str2的length值来计算,此问题涉及到每个字符的数量,在简单问题:计算char[]中每个字符的数量时,使用的桶排序,本题中也应使用类似的结构来解题 2)解题思路:滑动窗口+桶; 使用一个桶来装str2的所有字符的数量,然后先向右扩张窗口,遍历到桶中原有字符时且该字符的数值>0,此时

2021-03-22 22:36:39 539

原创 2.6 字符串找到字符串的最长无重复子串

给定一个字符串str,返回str的最长无重复子串的长度。 分析: 1)滑动窗口–如何确定滑动窗口的首尾, 2) 代码实现: public int getMaxNoRepeat(String str){ if(str == null || str.equals("")){ return 0; } char[] chas = str.toCharArray(); int[] map = new int[25

2021-03-17 16:35:06 108

原创 2.5 字符串-0左边必有1的二进制字符数量

给定一个整数N,N代表全部由0或者1字符组成的二进制字符串的长度,求该长度下,所有满足0的左边必有1的字符串的数量 分析: 1)暴力方法时间复杂度为 2^n * n 2)优化算法:先分析题意,要求0的左边必有1,再次涉及到子串问题,且需连续,以动态规划来解决,按照以往的思路不难得出,dp[i]的值代表着,以 ,重新分析,在最大公共子串中,求最大公共子串,是从左到右遍历,i位置的值取决于i-1,且遍历到i时,是以i结尾。本题中, 依然是先确定字符串左边,再确定右边的动态,但相反的是dp值代表的却是在左边字符串

2021-03-17 13:50:29 380

原创 2.4 字符串-括号字符串的最长有效长度

给定一个括号字符串,返回最长的有效括号子串 分析: 1)同样以动态规划思维解决: 首先,dp应该代表什么? 以i位置的字符结尾的最长有效括号子串. ?此类dp值代表强制性以i结尾计算值的特征为(如:最长公共子串):题目要求中符合条件的值一定都是连续的? 2)通过dp值来解决动态规划通式,dp值代表以i位置字符结尾的最长有效括号子串 ① 根据dp值可知 若i位置的字符不为 右括号 ) 而是左括号 ( 那一定是无效的。此时我们只需要分析 右括号结尾的情况 ②以 ) 结尾 来分析,那么dp[i]的值就涉及到 前

2021-03-16 23:21:00 446

原创 2.3 字符串-添加最少字符使字符串都是回文字符串

给定一个字符串str,可以在str的任意地方添加字符,请返回在添加字符最少的情况下,让str整体都是回文字符串的结果 分析: 1)问题关键:如何以个例推整体,再由整体推回个例? 回文字符串问题:显然,当任意 [i… j]字符串为回文字符串时,其中的任意k使得[i+k…j-k] 同样也是回文字符串,这样可以推出结论:先假设字符串str[i…j]已经是回文字符串,那么不论是在前面或者后面再加一个字符,此时我们最多只需要再在另一头再加上这个字符就使整体再次成为字符串。(注:是否存在我单单只加一个字符不改变回文结构

2021-03-16 13:04:40 970

原创 2.2 字符串-判断字符数组中字符是否只出现过一次(这道题的堆排序未能啃下,需复习)

给定一个字符类型数组chas[] 判断chas中所有字符是否都只出现过一次 要求: 1.时间复杂度保证为N 2.实现额外空间复杂度为 1,尽量降低时间复杂度 分析: 1),通常排序的做法可以做到时间复杂度为N,只是遍历一遍数组,一般而言,空间复杂度至少为N 2)采用堆排序可以保证额外空间复杂度为1, 什么是堆排序,(涉及大根堆,小根堆) public void heapSort(char[] chas){ for(int i = 0; i < chas.length; i++){

2021-03-15 16:24:48 90

原创 2.1字符串-判断是否互为变形词

给定两个字符串str1和str2,如果俩字符串中 出现的字符种类相同且相应的出现次数也能对上号,则声明为变形词。 分析: 1)简单题,解法:申请一个桶。当字符类型较多时,可以申请哈希表来代替桶的整型数组。 2)为何用桶排序,桶的核心在哪? 不断的装水倒水,短板效应。 代码实现: public boolean isBianXing(String str1, String str2){ if(str1.length() != str2.length() || str1 == null || str2 ==nul

2021-03-15 13:14:24 74

原创 1.8 动态规划之最大公共子串问题。

给定两个字符串,str1、str2,求返回俩字符串最长公共子串。 分析: 1)本题与求最长公共子序列相似,但又有所不同。在求子序列问题中,动态规划通式i、j位置的值取决于三个位置,dp[i-1][j-1] dp[i-1][j] dp[i][j-1], 三者中, 2)先假设最后一个字符相等,纳入最长子序列中,那么如果只改变一个变量,不论是i或者是j加一,因为原有子序列已达到最长且最边界的情况,只增加其中一个序列是无法影响最长公共子序列的,此时i、j都增加一个元素且该元素相等才有可能会影响 3)最后

2021-03-15 09:16:12 297

原创 1.7动态规划之最长公共子序列问题

给定俩字符串str1、str2,返回俩字符串的最长公共子序列 分析: 1)找到俩可变参数,参数一旦确定,后续结果就确定,只能是俩字符串的长度。在两个字符串长度变化的过程中,分析某一处 i、j (str1取i长度,str2取j长度)的最长公共子序列由谁决定? 2)由动态规划解题思路可知,1)所提出的问题建立在任一 m<i,j<n的取值都已知,那么dp[i][j]的取值由三种情况决定: ①str1[i] == str[j] ,那么此时 dp[i][j] = dp[i-1][j-1] + 1. ②st

2021-03-14 22:43:46 60

原创 1.6动态规划之经典递归-汉诺塔

问题不再多做赘述: 分析: 1)以动态规划的思维分析: 将N个盘子从左移到右 ①首先考虑怎样将第N个盘子移到右边去, ②分为三步,1.将上面的n-1移到中间,2.将N移到右边,3.将n-1移到右边。如何以动态规划的思维将这个推导出这最后一步前面的的移动方式。 ③此时n已经移动完成,那么我们去移动第n-1个,同样是上面的三步,只是现在的中间柱子变为 此时考虑如何将上面的n-1移动,1.将n-2移到中间,(此时n-1原在柱子已经从左变为中,而我们目标柱为右,所以中转柱为 左柱(萨斯给!!)),2.将第n-1从“

2021-03-14 19:51:50 248

原创 1.5动态规划之最长递增子序列

问题:给定数组arr,返回数组arr的最长递增子序列 分析: 1)求最长递增子序列,首先搞懂子序列,而不是子数组,所以就只是要求,组成的子元素按照原来的顺序排列,而不要求是连续的。 2)首先把话放这,根据题意,最长增长子序列,既然是最长的子序列,那通常来说,序列中的元素都是随机的,那么要做到最长,只有保证子序列中的元素近可能紧密的递增,这样才是最长的。原题解题思路中,紧密围绕着该思想。 3)个人解题思路:既然还是要求子序列,同样可以想象成一个滚动数组一样的解题方法,创造一个数组,在遍历原数组的过程中,放入滚

2021-03-14 19:18:12 138

原创 1.4动态规划之机器人到达指定位置方法数(思想极为重要,动态规划所有题目解法思路)

问题描述: 排成一行的1~N,N一定大于等于2,开始在其中的某一个位置M上,机器人可以往左走,或者往右走,规定机器人只能走k步,而最终要求到达怕p位置,求有多少种走法。 思路:(前提:尝试的过程都是无后效性的) 1)M * N 的表格,搞清楚M、N各自的含义,此时需要一个可变参数能具体代表递归的状态,即该参数一旦确定,递归的状态就定了, 2)可变参数组成的表格。 3)先确定表格中变数最少,或者根本就没有变数的地方,然后根据这些已填参数思考是否能一步一步推导递归后面的复杂的参数。 机器人走路方法问题中: 1)

2021-03-14 15:03:59 303

原创 1.3动态规划值矩阵最小路径和

题目要求: 矩阵大小为M * N,行数M,列数N,需要从左上角走到右下角,每个路径上的数字代表的是路径数值,求最小路径和。 分析: 1)同样以动态规划来分析,从左上角走到右下角,任取一个i、j,易得知想要走到该位置,前一步只能是 [i-1][j],或者[i][j-1],那么动态规划的通式易得知, min_sum[i][j] = Math.min( min_sum[i-1][j] + a[i-1][j], min_sum[i][j-1] + [i][j-1] 2)空间优化:思路已定,不难得出,在第一行,或者

2021-03-14 14:32:04 234

原创 1.2动态规划问题之连续子数组最大和

题目 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 思路: 1)最大连续子数组,通常连续子数组会考虑到头尾的索引值,这里肯定不会去向暴力解法,那么优化的情况下要求时间复杂度为n,因为是连续子数组有关,首先考虑通过滚动数组去遍历。 2)滚动数组遍历:核心:最大和的判断肯定不是问题,问题在于,该滚动数组的头尾索引变化的情况,如何去判断,在什么样的情况下正确改变头尾下标的值。 ①尾索引:思考了半天感觉,尾索引没什么好说的,当然只要是正数就可以

2021-03-14 13:54:24 90

原创 1.1动态规划问题之爬楼梯

题目主体 数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。 请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs 著作权归领扣网络所有。商业转载请

2021-03-14 13:26:41 251

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除