![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
皮皮蟹01
在校计算机专业本科生一枚,想与大家一起交流技术、代码、前沿科技、new idea。还请社区里的大神们多关照。^_^
展开
-
【算法】不用乘、除、取余操作实现除法
2021-09-27来自剑指offerⅡ的一道题,如何在不使用乘号、除号、取余符号的情况下实现整数除法操作。首先想到的是被除数循环减除数,减到不能再减了,减的次数就是最终答案。这也是除法的本质,但是能不能快一点不用一个一个减呢?答案是可以的,我们可以通过位移被除数的操作来判断可减去除数的数量,代码如下。class Solution { // a为被除数,b为除数 public int divide(int a, int b) { if (a == 0)原创 2022-01-26 18:07:59 · 1334 阅读 · 0 评论 -
【算法】Kruskal回顾
2021-05-20今天520耶,然鹅并没有什么故事,反倒是校园湖里的龟龟都是齐刷刷地出来晒背,湖里的黑天鹅也都成双成对。今天回顾一下最小生成树Kruskal算法,先以题目代入吧。问题描述给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :abs(xi - xj) + abs(yi - yj)。请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条原创 2022-01-26 18:02:11 · 186 阅读 · 0 评论 -
【算法】交换交换字符串中的元素-并查集
2021-05-19问题描述给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。你可以 任意多次交换 在 pairs 中任意一对索引处的字符。返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。示例 1:输入:s = “dcab”, pairs = [[0,3],[1,2]]输出:“bacd”解释:交换 s[0] 和 s[3], s = “bcad”交换 s[1] 和 s[2],原创 2022-01-26 18:01:16 · 135 阅读 · 0 评论 -
【算法】一个背包问题
2020-09-23背包问题可以说是动态规划的经典问题了,围绕背包问题能够衍生出很多类似的问题。动态规划看起来不是那么好解决,它涉及到重复子问题和最优子结构,还有状态转移方程的寻找。充分理解了动态规划背后的逻辑,就会理解到其实它真正的原理就是穷举,但它是聪明地进行穷举。今天遇到一道题,类似思路类似于背包问题。问题描述//在计算机界中,我们总是追求用有限的资源获取最大的收益。//// 现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。////原创 2022-01-25 21:19:54 · 59 阅读 · 0 评论 -
【算法】回文子串的数量(manacher)
2020-08-06之前写过一篇关于马拉车算法求最长回文子串的博客,讲到马拉车算法能在O(N)的时间复杂度下求得最长回文子串,今天遇到一个问题:求字符串中的回文子串的数量,这同样可以用马拉车算法来计算。特此记录一下。问题描述输入: “abc”输出: 3解释: 三个回文子串: “a”, “b”, “c”.输入: “aaa”输出: 6说明: 6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”.代码对于马拉车算法的原理可以参考 https://xiepl1原创 2022-01-25 21:18:47 · 393 阅读 · 0 评论 -
【小记】对于动态规划问题的一点小记录
2020-07-27以前看到动态规划问题毫无思路,脑子里只有多重for的想法。随着见过的和做过的问题越来越多,逐渐地对解决动态规划问题有了些许心得。动态规划问题的一般形态就是求最值,其问题的核心就是穷举,因为是要求得最值,那么肯定是要把所有的可能都列举出来,这样才能够得到其中的最值呗!是的呢,但这和多重for穷举有什么区别嘛?那当然有区别了,动态规划的穷举有点特别,它是一种“聪明的穷举”。动态规划所解决的问题都有些特别,那就是这类问题都存在重叠子问题,如果单纯是暴力穷举的话效率是会很低的,为了共用之前原创 2022-01-25 21:18:15 · 47 阅读 · 0 评论 -
【算法】验证二叉搜索树
2020-03-05给定一个二叉树,判断其是否是二叉搜索树。一个二叉搜索树的特点是:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。示例:输入: 2 / \ 1 3输出:true输入: 5 / \ 1 4 / \ 3 6输出:false二叉搜索树有一个特点,就是中序遍历序列为递增序列,例如示例1的中序遍历为1-2-3;而示例2的中序遍历为1-5-3-4-6,不是递增,则其不是二叉搜索树。代码如下原创 2022-01-24 17:42:21 · 304 阅读 · 0 评论 -
【算法】LeetCode91.解码方法(类似爬楼梯)
2020-02-10一条包含字母A-Z的消息通过以下方式进行了编码:'A' -> 1'B' -> 2....'Z' -> 26给定一个只包含数字(包括0)的非空字符串,请计算解码方法的总数。示例1:输入:“12”输出:2解释:它可以解码为“AB”(1 2)或者“L”(12)示例2:输入:“226”输出:3解释:它可以解码为“BZ”(2 26),“VF”(22 6),或者“BBF”(2 2 6)解题思路(动态规划)首先举例子:例如计算22113的解码方法原创 2022-01-24 17:41:40 · 163 阅读 · 0 评论 -
【算法】LeetCode 1248 统计[优美子数组]
给你一个整数数组 nums 和一个整数 k 。如果某个连续的子数组中恰好有 k 个奇数数字,我们就认为这个子数组是优美子数组。请返回这个数组中优美子数组的数目。分析例如给出数组0 1 1 0 1 0 0 1 0给出 k = 3很容易可以得出的两个两端都为奇数的符合要求的子数组:(1)1 1 0 1and(2)1 0 1 0 0 1由此来进行扩展:首先对于(1),左端可以选择扩展 1 位或者不扩展,所以一共有 2 种选择。右端可以选择扩展 1 位、2 位或者不扩展,扩展 3 位的原创 2022-01-24 17:35:49 · 206 阅读 · 0 评论 -
【算法】下一个排列
题目描述实现获取下一个排列的函数,算法需要将给定的数字序列重新排列成字典序中下一个更大的排列,如果不存在则将数字重新排列成最小的排列(即升序排列),必须原地修改。例如1,2,3 --> 1,3,21,5,8,6,7,3,2,1 --> 1,5,8,7,1,2,3,6为了得到下一个排列,首先找到从右往左的第一对nums[i-1] < nums[i]的一对数,然后在nums[i-1]的右边的序列中按照从右往左的顺序找到第一个大于nums[i-1]的元素nums[j],题目中要求的下一原创 2022-01-24 17:33:34 · 155 阅读 · 0 评论 -
【算法】Manacher(马拉车)算法
原jekyll 2019-09-07Manacher’s Alogrithm,中文名叫马拉车算法,是一位叫Manacher的人在1975年提出的一种算法,解决的问题是求最长回文子串,算法的神奇之处就在于将时间复杂度精进到了O(N)。还记得在两年前的四省赛中,有一道关于回文的题,题解就是用马拉车算法做解的,然而我们没有做出来。01 由来在求解最长回文子串时,一般的思路是以当前字符为中心向两边扩展寻找回文,但复杂度是O(N^2),那能不能将复杂度降低到线性?马拉车算法就是为此诞生的。02 预处理为了在原创 2022-01-24 17:31:24 · 591 阅读 · 0 评论