![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法学习笔记
文章平均质量分 52
从入门到放弃系列。
Gh0st'
这个作者很懒,什么都没留下…
展开
-
目录
算法小白终于还是踏上了算法这条不归路,记录一下做题历程,刚开始没意外的话应该是以看题解为主(我为什么这么菜o(╥﹏╥)o) 虽然是目录,不过还没想好怎么分类,先鸽在这吧。原创 2021-03-22 22:07:32 · 43 阅读 · 0 评论 -
kmp算法
终于还是踏上了算法这条不归路,记录一下做题的历程 KMP算法 用以解决串匹配问题,蛮力算法的缺点在于每次匹配失败后向后移动一个字符继续匹配继续匹配。尽管第一次匹配是有必要的,但后续的大量重复匹配就没有必要了。 蛮力算法,eg: kmp算法的大致过程: next表的建立是基于模式串中已匹配的串中相似的前缀和后缀,简单的说,就是已匹配前缀中的前缀和后缀有相同部分。大致过程如下(以上图为例): 注:若前缀中含有多个相似的前缀和后缀,kmp会选择右移最小的那个(相对安全),同时也表明舍弃的那部分对齐位置确实是不原创 2021-04-24 20:16:51 · 102 阅读 · 0 评论 -
移除元素
终于还是踏上了算法这条不归路,记录一下做题的历程 移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需原创 2021-04-19 15:03:09 · 80 阅读 · 0 评论 -
删除有序数组中的重复项
删除有序数组中的重复项 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = remove原创 2021-04-18 09:54:04 · 1170 阅读 · 1 评论 -
最大数
终于还是踏上了算法这条不归路,记录一下做题的历程 最大数 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 示例 输入:nums = [10,2] 输出:“210” 输入:nums = [3,30,34,5,9] 输出:“9534330” 输入:nums = [1] 输出:“1” 输入:nums = [10] 输出:“10” 排序 按照字符合并后的情况(自定义方式)进行排序后,进而原创 2021-04-12 17:00:25 · 125 阅读 · 0 评论 -
丑数 II
丑数 II 给你一个整数 n ,请你找出并返回第 n 个 丑数 。 丑数 就是只包含质因数 2、3 和/或 5 的正整数。 示例 输入:n = 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。 输入:n = 1 输出:1 解释:1 通常被视为丑数。 最小堆 有完全二叉树的特点,堆内元素升序排序。 第一次使用优先队列的stl,查了一下相关资料。 定义:priority_queue<Type, Container, F原创 2021-04-11 16:47:33 · 77 阅读 · 0 评论 -
丑数
终于还是踏上了算法这条不归路,记录一下做题的历程 丑数 给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。 丑数就是只包含质因数 2、3 和/或 5 的正整数。 示例 输入:n = 6 输出:true 解释:6 = 2 × 3 输入:n = 8 输出:true 解释:8 = 2 × 2 × 2 输入:n = 14 输出:false 解释:14 不是丑数,因为它包含了另外一个质因数 7 。 输入:n = 1 输出:true 解释:1 通常原创 2021-04-10 20:10:04 · 67 阅读 · 0 评论 -
寻找旋转排序数组中的最小值 II
终于还是踏上了算法这条不归路,记录一下做题的历程 寻找旋转排序数组中的最小值 II 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,4] 若旋转 7 次,则可以得到 [0,1,4,4,5,6,7] 注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[原创 2021-04-09 19:52:49 · 69 阅读 · 0 评论 -
寻找旋转排序数组中的最小值
终于还是踏上了算法这条不归路,记录一下做题的历程 寻找旋转排序数组中的最小值 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2] 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7] 注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1],原创 2021-04-08 16:42:39 · 257 阅读 · 0 评论 -
搜索旋转排序数组 II
终于还是踏上了算法这条不归路,记录一下做题的历程 搜索旋转排序数组 II 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为[nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …,nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处原创 2021-04-07 10:16:10 · 70 阅读 · 0 评论 -
删除有序数组中的重复项 II
删除有序数组中的重复项 II 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len =原创 2021-04-06 16:58:31 · 196 阅读 · 0 评论 -
合并两个有序数组
终于还是踏上了算法这条不归路,记录一下做题的历程 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 初始化nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自nums2 的元素。 示例 输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,原创 2021-04-05 11:46:06 · 486 阅读 · 0 评论 -
森林中的兔子
终于还是踏上了算法这条不归路,记录一下做题的历程 森林中的兔子 森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。 返回森林中兔子的最少数量。 示例 输入: answers = [1, 1, 2] 输出: 5 解释: 两只回答了 “1” 的兔子可能有相同的颜色,设为红色。 之后回答了 “2” 的兔子不会是红色,否则他们的回答会相互矛盾。 设回答了 “2” 的兔子为蓝色。 此外,森林中还应有另外 2 只蓝色兔子的原创 2021-04-04 20:42:00 · 85 阅读 · 0 评论 -
最长公共子序列
终于还是踏上了算法这条不归路,记录一下做题的历程 最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。 示例原创 2021-04-03 19:40:17 · 65 阅读 · 0 评论 -
直方图的水量
终于还是踏上了算法这条不归路,记录一下做题的历程 直方图的水量 给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 双指针 使用左右两指针和左右高度最大值数组。 两指针相遇时结束循环,未相遇时,一边高度的最大值 - 一边当前位置的高度 = 此次的存水量(左右两边)。 class Solution { public: int trap(vector&原创 2021-04-02 22:23:37 · 228 阅读 · 0 评论 -
笨阶乘
终于还是踏上了算法这条不归路,记录一下做题的历程 笨阶乘 通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积。例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1。 相反,我们设计了一个笨阶乘 clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。 例如,clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2原创 2021-04-01 21:08:02 · 76 阅读 · 0 评论 -
颠倒二进制位
终于还是踏上了算法这条不归路,记录一下做题的历程 颠倒二进制位 颠倒给定的 32 位无符号整数的二进制位。 示例 输入:n = 00000010100101000001111010011100 输出:964176192 (00111001011110000010100101000000) 解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 00111001011110000010原创 2021-03-29 16:04:12 · 138 阅读 · 0 评论 -
扁平化嵌套列表迭代器
终于还是踏上了算法这条不归路,记录一下做题的历程 /** * // This is the interface that allows for creating nested lists. * // You should not implement it, or speculate about its implementation * class NestedInteger { * public: * // Return true if this NestedInteger hol原创 2021-03-23 19:57:08 · 79 阅读 · 0 评论 -
位1的个数
终于还是踏上了算法这条不归路,记录一下做题的历程。 位1的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 例如: 输入:00000000000000000000000000001011 输出:3 解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。 本质还是计数。 循环检查二进制位 这个想法还是挺好理解的 我们可以直接循环检查给定整数 n 的二进制位的每一位原创 2021-03-22 22:16:39 · 130 阅读 · 0 评论 -
LC0058-左旋转字符串
注:以下内容参考力扣题解,仅用于学习和记录不同算法实现,如有侵权请联系本人修改。 题目地址:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/ 左旋字符串题目描述解题思路一、循环取余赋值二、三次旋转三、切片 题目描述 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的...原创 2020-04-05 16:24:02 · 135 阅读 · 0 评论