算法笔记
已成功入职互联网大厂,都因名 LSY_HELLOWORLD,关注我,了解后续生活把
LSY_HELLOWORLD
这个作者很懒,什么都没留下…
展开
-
给定一个字符串,找到长度为n的字典序最大的子串
func main() { n, k := 0, 0 str := "" fmt.Scan(&n, &k, &str) ans := "" count := 0 for len(str) > 0 { i, s := find(k-count, str) count++ ans += s str = str[i+1:] if count == k { break } } fmt.Println(ans)}func find(ind原创 2021-08-25 18:47:24 · 398 阅读 · 0 评论 -
给定一个字符串,找出包含n个不同字符的最短子串
解决思路为:左右指针实现滑动窗口窗口里为包含n个不同字符的子串遍历一次,记录最短的子串package mainimport ( "fmt" "math")func main() { str := "abbbccdd" n := 3 ans := "" l, r := 1, 1 dif := 1 //l到r中间 出现的不同字符的个数 minlen := math.MaxInt32 rlastchar := str[0] //记录上一个字符 判断当前的是不是换了不同的字原创 2021-08-25 17:02:25 · 556 阅读 · 0 评论 -
golang实现优先队列,解决编译依赖的问题
package mainimport ( "container/heap" "fmt")type IntHeap []intfunc (h IntHeap) Len() int { return len(h) }func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] } // 大顶堆,返回值决定是否交换元素func (h IntHeap) Swap(i, j int) { h[i], h[j原创 2021-08-18 12:09:19 · 150 阅读 · 0 评论 -
算法题的常见类型
douyin LSY_HELLOWORLD,已成功入职互联网大厂,请关注我,了解非科班的程序员的工作生活把原创 2021-07-16 16:08:10 · 130 阅读 · 0 评论 -
Golang实现并查集,解决分类分门派分省份等按关系分组的问题
解决问题举例1,有不同的金庸笔下的人物,给出不同人物和人物之间的关系如果他们间接都有联系,说明他们属于一本小说里,求这些人属于几本书2,力扣547题,如果不同城市可以间接连同,说明属于一个省份,求一共有几个省份3,忘了哪个公司的真题,吃鸡游戏跳伞的时候可以选择跟随,每个人都跟随一个人,也可以跟随自己,如果一些人都间接跟随,那么他们属于一个团队,求最终落下的会有几个团队。并查集的思想就是,求出来每个人的祖父,将其合并在一起,变成一个祖父;步骤如下:1 将每个人的祖父设为自己2 对于不同的两个人原创 2021-07-16 15:31:02 · 250 阅读 · 0 评论 -
Golang利用快排思想寻找第K大个数
快排的思想就是寻找一个base,一般令其等于数组第一个元素然后将小于等于base的数放base左边,大于的放右边分别对左边的和右边的数组进行快排递归最后的数组就是完成排序的寻找第K大个数,就是在完成快排的时候,判断当前base所在的位置和所需要的位置的情况,然后每次只快排一半就行啦。代码实现如下:package mainfunc main() { ans := []int{1332802, 1177178, 1514891, 871248, 753214, 123866, 1615原创 2021-07-16 13:28:24 · 429 阅读 · 0 评论 -
Golang实现层序遍历,并按层将数分组
题目来源牛客练习题层序遍历通过队列来实现,每次将当前节点的子节点添加到队列尾部,再从队列头部取出一个元素即可。此道题目要求按层分成不同的数组,因此多一个步骤,要记录该节点属于的层数。添加一个结构体即可,当队列为空或者当前节点和下一个节点的层数不一样,就将累加的数组添入答案即可。代码如下所示:type data struct { node *TreeNode floor int}func levelOrder(root *TreeNode) [][]int { // write c原创 2021-07-16 12:51:54 · 504 阅读 · 0 评论 -
golang实现KMP算法,解决长字符串寻找字串是否存在,出现次数等问题
S是子串,T是母串,核心问题就是寻找S在T中出现的情况。如果S长度为m,T长度为n,按照暴力解法,最坏的时间复杂度应该为O(n*m),太高啦。而KMP时间复杂度仅为O(n+m)。KMP算法的核心就是计算出一个next数组,用来存放子串的最长相同前缀后缀。最长前缀视为不包含最后一个字符的所有元素;最长后缀视为不包括第一个字符的所有元素。例如对于abcabcab对于ab 结果为0 没有相同的对于abc 结果为0 没有相同的对于abca 结果为1 前后缀相同为a对于abcab 结果为2 前后缀原创 2021-07-15 23:01:59 · 442 阅读 · 0 评论 -
golang实现全排列问题,利用回溯算法,以及小坑
针对解决的问题就是全排列例如给个123输出123 132 213 231 312 321利用回溯来解决问题将每一位填一下所有的数,对于下一位未填未填过的所有数。package mainimport "fmt"func main() { //实现全排列 input := []int{5, 4, 6, 2} n := len(input) output := [][]int{} var traceback func(count int, tmp []int, had map[int]原创 2021-07-14 16:19:59 · 637 阅读 · 0 评论 -
Golang实现字典树,寻找公共前缀的字符串
字典树可以用来解决搜索前缀问题例如给若干个不同长度的字符串找出有公共前缀的字符串有几个面试遇到的或者计算身份证号,同样前缀的身份证号有多少个之前牛客模考遇到的此算法在搜索引擎中非常使用,写了前几个字就会弹出来相关搜索。以及在存储大量有重复前缀的数据时可以节省大量空间。查找的时间复杂度就是O(字符串长度)本质上是个树,因此用链表链接。以下代码用字符串来表示,假设只有26个小写字母。package mainimport "fmt"//结构体根据需要自行设置type tree str原创 2021-07-13 23:21:01 · 564 阅读 · 0 评论 -
leetcode之炒股票系列大全
买卖股票的最佳时机func maxProfit(prices []int) int { buy, sell := math.MinInt64, 0 for i := range prices { buy = max(buy, -prices[i]) sell = max(sell, buy+prices[i]) } return sell}func max(x, y int) int { if x > y { return x } return y}买卖股.原创 2021-06-12 23:21:14 · 96 阅读 · 0 评论 -
Golang之力扣403青蛙过河
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/frog-jump一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2原创 2021-06-03 21:29:18 · 144 阅读 · 0 评论 -
Golang实现快速排序和归并排序以及堆排序算法全注释
快速排序算法快速排序算法步骤如下:首先从一个数组里找一个基准对数组进行遍历把比基准小的放基准左边,把比基准大的放基准右边以基准为分割点,分成两个数组重复1-4步骤直到数组长度为1返回func quickSort(data []int) {//如果数组长度为1,返回 if len(data) <= 1 { return } //设置基准为数组第一个元素 base := data[0] //两个指针分别指向待交换首尾位置 l, r := 0, len(data)-1原创 2021-06-03 20:33:11 · 299 阅读 · 0 评论 -
验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。解法1func isValidBST(root *TreeNode) bool { pre:=math.MinInt64 var dfs func(nroot *TreeNode)bool dfs=func(nroot *TreeNode)bool{ if nr原创 2021-06-02 22:24:16 · 98 阅读 · 0 评论 -
力扣523连续得子数组和——前缀和,同余
题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/continuous-subarray-sum给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true ;否则,返回 false 。如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。示例 1:输入:nums原创 2021-06-02 13:24:54 · 138 阅读 · 0 评论 -
Golang回文数变换代价
题目来源 360春招2021编程题所谓回文数就是一个数字,从左边读和从右边读的结果都是一样的,例如12321。现在有一个只包含1、2、3、4的数字,你可以通过在任意位置增加一位数字或者删除一位数字来将其变换成一个回文数。但是增加或删除不同数字所需要的代价是不一样的。已知增加和删除每个数字的代价如下:增加一个1,代价:100;删除一个1,代价:120。增加一个2,代价:200;删除一个2,代价:350。增加一个3,代价:360;删除一个3,代价:200。增加一个4,代价:220;删除一个4,代价原创 2021-05-24 14:48:24 · 785 阅读 · 3 评论 -
Golang实现宝藏最高价值问题(动态规划)
题目来源 360春招笔试题2021年X星人发现了一个藏宝图,在藏宝图中标注了N个宝库的位置。这N个宝库连成了一条直线,每个宝库都有若干枚金币。X星人决定乘坐热气球去收集金币,热气球每次最多只能飞行M千米(假设热气球在飞行过程中并不会发生故障)此外,由于设计上的缺陷,热气球最多只能启动K次。X星人带着热气球来到了第1个宝库(达到第1个宝库时热气球尚未启动),收集完第1个宝库的金币后将启动热气球前往下一个宝库。如果他决定收集某一个宝库的金币,必须停下热气球,收集完之后再重新启动热气球。当然,X星人每到一原创 2021-05-23 22:33:32 · 433 阅读 · 0 评论 -
Golang实现七星不靠中国麻将能否胡牌算法
题目来源网易互娱2021笔试题七星不靠是中国麻将竞赛规则的番种,胡牌时由东南西北中发白7张,外加其他花色的147、258、369不相连的牌型,且没有将牌而组成。七星不靠中的七星是指:东西南北中发白,也就是牌中必须有这七张。而其它牌按下述的来拼全:东西南北中发白+147万+258饼+369条东西南北中发白+147万+258条+369饼东西南北中发白+147条+258万+369饼东西南北中发白+147条+258饼+369万东西南北中发白+147饼+258条+369万东西南北中发白+147饼+25原创 2021-05-19 18:33:04 · 681 阅读 · 0 评论 -
Golang实现LRU缓存
什么是LRULRU是Least Recently Used的缩写,即最近最少使用。实际生活中应用非常广,例如所有手机的后台应用。在打开后台应用时,最前显示的一定是最近使用的,包括最新打开的,或者打开之前的;超过后台限制时则将最老的程序关掉。即设置一个队列,有两个操作,新建和使用。新建时,将新输入的元素放入队列头部,使用时,将使用的队列里的元素,从队列中取出,并放到队列头部当队列元素达到上限时,删除队尾元素。package mainfunc main() {}type LRUCac原创 2021-05-18 20:29:23 · 478 阅读 · 0 评论 -
Golang递增子序列系列问题
一共包括三个子问题实现语言问golang,在二分法中用到了sort包里的SearchInts最长连续递增子序列func continuouslengthOfLIS(nums []int) int { //最长的连续递增子序列长度 ans, left := 1, 0 for i := 1; i < len(nums); i++ { if nums[i] <= nums[i-1] { ans = max(ans, i-left) left = i } } ans原创 2021-05-18 15:35:19 · 230 阅读 · 0 评论