随笔分类 - 数据结构与算法
摘要:
还可以从字符串的每个位置开始,向左向右延长,判断存在多少当前位置为中轴的由01连续二进制字符串。
阅读全文
还可以从字符串的每个位置开始,向左向右延长,判断存在多少当前位置为中轴的由01连续二进制字符串。
阅读全文
摘要:
我们可以从字符串的每个位置开始,向左向右延长,判断存在多少当前位置为中轴的回文字符串。
阅读全文
我们可以从字符串的每个位置开始,向左向右延长,判断存在多少当前位置为中轴的回文字符串。
阅读全文
摘要:
我们可以记录两个字符串每个位置的字符第一次出现的位置,如果两个字符串中相同位置的字符与它们第一次出现的位置一样,那么这两个字符串同构。例如:paper和title,当我们现在遍历到第三个字符p和t,发现它们第一次出现的位置都在第一个字符,说明目前位置满足同构。
阅读全文
我们可以记录两个字符串每个位置的字符第一次出现的位置,如果两个字符串中相同位置的字符与它们第一次出现的位置一样,那么这两个字符串同构。例如:paper和title,当我们现在遍历到第三个字符p和t,发现它们第一次出现的位置都在第一个字符,说明目前位置满足同构。
阅读全文
摘要:
建立一个哈希表映射,一共26个字母,可以用一个数组来代替哈希表,我们先判断两个字符串长度不相同返回false。然后把s中所有字符出现个数统计起来,存入一个大小为26的数组中。再统计t字符串,如果发现不匹配则返回false。
阅读全文
建立一个哈希表映射,一共26个字母,可以用一个数组来代替哈希表,我们先判断两个字符串长度不相同返回false。然后把s中所有字符出现个数统计起来,存入一个大小为26的数组中。再统计t字符串,如果发现不匹配则返回false。
阅读全文
摘要:
题目给我们一个数组,让我们找出最长的和谐子序列,和谐子序列就是序列中数组的最大最小差值均为1,这里只让我们求长度,而不需要返回具体的子序列。所以我们可以对数组进行排序,实际上只要找出来相差为1的两个数的总共出现个数就是一个和谐子序列长度了。
阅读全文
题目给我们一个数组,让我们找出最长的和谐子序列,和谐子序列就是序列中数组的最大最小差值均为1,这里只让我们求长度,而不需要返回具体的子序列。所以我们可以对数组进行排序,实际上只要找出来相差为1的两个数的总共出现个数就是一个和谐子序列长度了。
阅读全文
摘要:
首先给数组的度下一个定义,给一个数组,某个或某些数字出现最多的次数为该数组的度。题目要求我们找到最短的子数组使其和原数组拥有相同的度。
阅读全文
首先给数组的度下一个定义,给一个数组,某个或某些数字出现最多的次数为该数组的度。题目要求我们找到最短的子数组使其和原数组拥有相同的度。
阅读全文
摘要:
我们可以用单调栈来解决这个问题,因为是循环数组,我们遍历两倍的数组,然后对坐标i取余,取出数字,如果此时栈不为空,且栈顶元素小于当前数字,说明当前数字就是栈顶元素的右边第一个较大的数,此时建立二者的映射并且去除当前栈顶元素,最后如果i小于n,则把i压入栈。因为res的长度必须是n,超过n的部分我们只是为了给之前栈中的数字找较大值,所以不能压入栈。
阅读全文
我们可以用单调栈来解决这个问题,因为是循环数组,我们遍历两倍的数组,然后对坐标i取余,取出数字,如果此时栈不为空,且栈顶元素小于当前数字,说明当前数字就是栈顶元素的右边第一个较大的数,此时建立二者的映射并且去除当前栈顶元素,最后如果i小于n,则把i压入栈。因为res的长度必须是n,超过n的部分我们只是为了给之前栈中的数字找较大值,所以不能压入栈。
阅读全文
摘要:
第三个:定义一个hash来保存sum出现的次数,这样累加sum-k出现的次数就是答案了
阅读全文
第三个:定义一个hash来保存sum出现的次数,这样累加sum-k出现的次数就是答案了
阅读全文
摘要:
使用队列,每次把新加入的数插到前头,这样队列保存的顺序和栈的顺序是相反的,它们的取出方式也是反的,那么反反得正,就是我们需要的顺序了。我样可以直接对队列q操作,在队尾加入了新元素x后,将x前面所有的元素都安排好顺序取出并加到队列到末尾,这样下次就能直接取出x了,符合栈的后入先出的特性,其他三个操作也就是直接调用队列的操作即可。
阅读全文
使用队列,每次把新加入的数插到前头,这样队列保存的顺序和栈的顺序是相反的,它们的取出方式也是反的,那么反反得正,就是我们需要的顺序了。我样可以直接对队列q操作,在队尾加入了新元素x后,将x前面所有的元素都安排好顺序取出并加到队列到末尾,这样下次就能直接取出x了,符合栈的后入先出的特性,其他三个操作也就是直接调用队列的操作即可。
阅读全文
摘要:
这道题让求一个二维区域和的检索,我们需要建立一个累计区域和的数组,然后根据边界值的加减法来快速求出给定区域之和。这里我们维护一个二维数组dp,其中dp[i][j]表示累计区间(0, 0)到(i, j)这个矩形区间所有的数字之和,那么此时如果我们想要快速求出(r1, c1)到(r2, c2)的矩形区间时,只需要dp[r2][c2]-dp[r2][c1-1]-dp[r1-1][c2]+dp[r1-1][c1-1]即可,下面用了辅助行和辅助列,所以有些许变动。
阅读全文
这道题让求一个二维区域和的检索,我们需要建立一个累计区域和的数组,然后根据边界值的加减法来快速求出给定区域之和。这里我们维护一个二维数组dp,其中dp[i][j]表示累计区间(0, 0)到(i, j)这个矩形区间所有的数字之和,那么此时如果我们想要快速求出(r1, c1)到(r2, c2)的矩形区间时,只需要dp[r2][c2]-dp[r2][c1-1]-dp[r1-1][c2]+dp[r1-1][c1-1]即可,下面用了辅助行和辅助列,所以有些许变动。
阅读全文
摘要:
这道题让我们检索一个数组的某个区间的所有数字之和,题目中给了两个条件,首先数组内容不会变化,其次有很多的区间和检索。那么我们用传统的遍历相加来求每次区间和检索,十分的不高效,而且无法通过OJ。所以这道题的难点就在于是否能想到来用建立累计直方图的思想建立一个累计和的数组dp,其中dp[i]表示[0,i]区间的数字之和,那么[i,j]就可以表示为dp[j]-dp[i-1],这里要注意一下当i=0时,直接返回dp[j]即可。
阅读全文
这道题让我们检索一个数组的某个区间的所有数字之和,题目中给了两个条件,首先数组内容不会变化,其次有很多的区间和检索。那么我们用传统的遍历相加来求每次区间和检索,十分的不高效,而且无法通过OJ。所以这道题的难点就在于是否能想到来用建立累计直方图的思想建立一个累计和的数组dp,其中dp[i]表示[0,i]区间的数字之和,那么[i,j]就可以表示为dp[j]-dp[i-1],这里要注意一下当i=0时,直接返回dp[j]即可。
阅读全文
摘要:
可以把所有数字放到一个哈希表,然后不断地从哈希表中任意取一个值,并删除掉其之前之后的所有连续数字,然后更新目前的最长连续序列长度。重复这一过程,就可以找到所有的连续数字序列,顺便找出最长的。
阅读全文
可以把所有数字放到一个哈希表,然后不断地从哈希表中任意取一个值,并删除掉其之前之后的所有连续数字,然后更新目前的最长连续序列长度。重复这一过程,就可以找到所有的连续数字序列,顺便找出最长的。
阅读全文
摘要:
利用一个双端队列,在队列中存储元素在数组中的位置,并且维持队列的严格递减,也就是说维持队列首元素是最大的,当遍历到一个新元素时,如果队列里有比当前元素小的,就将其移除队列,以保证队列的递减。当队列元素位置之差大于k,就将队首元素移除。
阅读全文
利用一个双端队列,在队列中存储元素在数组中的位置,并且维持队列的严格递减,也就是说维持队列首元素是最大的,当遍历到一个新元素时,如果队列里有比当前元素小的,就将其移除队列,以保证队列的递减。当队列元素位置之差大于k,就将队首元素移除。
阅读全文
摘要:
取每个Linked List的最小节点放入一个heap中,排成最小堆,然后取出堆顶最小的元素放入合并的List中,然后将该节点在其对应的List中的下一个节点插入到heap中,循环上面步骤。
阅读全文
取每个Linked List的最小节点放入一个heap中,排成最小堆,然后取出堆顶最小的元素放入合并的List中,然后将该节点在其对应的List中的下一个节点插入到heap中,循环上面步骤。
阅读全文
摘要:
什么是单调栈?单调栈通过维持栈内值的单调递增(递减)性,在整体O(n)的时间内处理需要大小比较的问题。
阅读全文
什么是单调栈?单调栈通过维持栈内值的单调递增(递减)性,在整体O(n)的时间内处理需要大小比较的问题。
阅读全文
摘要:
思路:括号匹配是典型的使用栈来解决的问题。从左向右遍历,每当遇到左括号便放入栈内,遇到右括号则判断其和栈顶的括号是否是统一类型,是则从栈内取出左括号,否则说明字符不串不合法。
阅读全文
思路:括号匹配是典型的使用栈来解决的问题。从左向右遍历,每当遇到左括号便放入栈内,遇到右括号则判断其和栈顶的括号是否是统一类型,是则从栈内取出左括号,否则说明字符不串不合法。
阅读全文
摘要:
可以额外建立一个栈(最小值栈),栈顶表示原栈中最小值。插入一个数字时,如果该值小于新栈的栈顶值说明该数是最小值,将其同时插入原栈和最小值栈。取数时,如果原栈的值等于最小值栈的值,说明这个数是原栈中的最小值,原栈和最小值栈需要同时移除该元素。
阅读全文
可以额外建立一个栈(最小值栈),栈顶表示原栈中最小值。插入一个数字时,如果该值小于新栈的栈顶值说明该数是最小值,将其同时插入原栈和最小值栈。取数时,如果原栈的值等于最小值栈的值,说明这个数是原栈中的最小值,原栈和最小值栈需要同时移除该元素。
阅读全文
摘要:
用两个栈来实现一个队列:因为需要得到先入先出的结果,所以必定要通过一个额外栈翻一次数组。这个翻转过程既可以在插入时完成,也可以在取值时完成。
阅读全文
用两个栈来实现一个队列:因为需要得到先入先出的结果,所以必定要通过一个额外栈翻一次数组。这个翻转过程既可以在插入时完成,也可以在取值时完成。
阅读全文
摘要:
思路:从左往右遍历,同时记录当前的最大值,每当当前最大值等于数组位置时,我们可以多一次分割。
阅读全文
思路:从左往右遍历,同时记录当前的最大值,每当当前最大值等于数组位置时,我们可以多一次分割。
阅读全文
摘要:
解题技巧:从右上角开始查找,若当前值大于待搜索值,向左移动一位,若当前值小于待搜索值,向下移动一位。如果最终移动到左下角时仍不等于待搜索值,则说明待搜索值不存在于矩阵中。
阅读全文
解题技巧:从右上角开始查找,若当前值大于待搜索值,向左移动一位,若当前值小于待搜索值,向下移动一位。如果最终移动到左下角时仍不等于待搜索值,则说明待搜索值不存在于矩阵中。
阅读全文

浙公网安备 33010602011771号