算法学习
文章平均质量分 73
漓艾初
云计算 资源管理 serverless 多聊聊~
展开
-
算法学习——逆序对
逆序对的题目归并解法剑指 Offer 51. 数组中的逆序对在正序归并的情况下,当存在左边大于右边的情况,就是存在右边数组大小的逆序对个数func reversePairs(nums []int) int { return merge(nums, 0, len(nums) - 1)}func merge(nums []int, start, end int) int{ if start >= end { return 0 } mid := start + (end - s原创 2021-12-26 23:14:55 · 283 阅读 · 0 评论 -
算法学习——分治
divide and conquer文章目录divide and conquer基本步骤使用场景Leetcode题[148. 排序链表](https://leetcode-cn.com/problems/sort-list/)[23. 合并K个升序链表](https://leetcode-cn.com/problems/merge-k-sorted-lists/)[395. 至少有K个重复字符的最长子串](https://leetcode-cn.com/problems/longest-substring原创 2021-12-26 23:12:29 · 505 阅读 · 0 评论 -
算法学习——前缀和
Cumulative Sum1. 两数之和func twoSum(nums []int, target int) []int { dic := make(map[int]int) for i, v := range nums { dic[target - v] = i } for i, v := range nums { if k, ok := dic[v]; ok && i != k { retur原创 2021-12-26 23:11:43 · 188 阅读 · 0 评论 -
算法学习——二分查找
二分查找一些套路啦PS:这里的所有情况都是基于模板条件 for ;left < rightfunc binSearch(nums []int) { left := 0 right := len(nums) - 1 for ;left<right; { mid = left + (right - left) / 2 if check(nums[mid]) { left = mid } else原创 2021-12-26 23:10:25 · 192 阅读 · 0 评论 -
算法学习——回溯场景
回溯存在模板:dfs = func(ele... interface{}) { if ele == len { // 递归结束条件 return } // 考虑当前位置 set = append(set, ele) dfs(ele + 1) // 递归下一个位置 set = set[: len(set) - 1] // 不考虑当前位置 dfs(ele + 1) // 递归下一个位置}Subset78. 子集// mine原创 2021-12-26 23:09:26 · 187 阅读 · 0 评论 -
常见的排序方法简介以及Go实现
常见的排序方法简介以及Go实现常见排序方法汇总相关概念排序方法思路及其实现插入排序(稳定)冒泡排序(稳定)归并排序(稳定)希尔排序/缩小增量排序 (不稳定)选择排序 (不稳定)堆排序 (不稳定)快速排序 (不稳定)计数排序 (稳定)桶排序(稳定)基数排序(稳定)参考文献常见排序方法汇总相关概念比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性原创 2021-02-03 16:46:49 · 132 阅读 · 0 评论 -
经典dp--股票买卖系列之Go写法
经典dp–股票买卖系列系列之GO写法一般方法求解(非DP)121. 买卖股票的最佳时机该题只能买卖一次,因此只要找到一个买入最低点以及对应的卖出最高点即可。因此我们可以使用一个变量minValue存储遍历过程中的最低点,然后在后续遍历中不断用price[i]减去minValue, 并取这个过程中的最大值即可。func maxProfit(prices []int) int { length := len(prices) if length < 2 { return 0 } mi原创 2021-01-19 21:20:29 · 337 阅读 · 0 评论 -
Go刷剑指offer
前言这个是我刷题碰到的一些自己不会的题,然后看看大佬们的题解来做的,这里需要特别感谢@Krahets大佬,有啥不懂,看看大佬的题解豁然开朗。下面的很多截图都是从大佬那里来的。剑指 Offer 45. 把数组排成最小的数// 实现Sort接口进行排序,这里的string可以实现为自己的数据结构type MySlice []string func (s MySlice) Len() int { return len(s)}func (s MySlice) Swap(i, j int)原创 2021-01-14 15:58:17 · 187 阅读 · 0 评论 -
算法学习——快慢指针的作用及其应用场景
快慢指针的作用针对链表的一些用法快慢指针寻找链表中位数初始时,快指针fast和慢指针slow均指向链表的左端点。我们将快指针fast向右移动两次的同时,将慢指针slow向右移动一次,直到快指针到达边界(即快指针到达右端点或快指针的下一个节点是右端点)。此时,慢指针slow对应的元素就是中位数。// 知道右边界func getMid(left, right *Node) *Node { if left == nil { return nil } fast :原创 2020-10-17 17:32:44 · 648 阅读 · 0 评论 -
经典dp--抢家夺舍系列之Go写法
抢家夺舍系列–经典dp系列GO写法house-robber首先我们从比较简单的角度来做:判断状态:题目只有两种状态,也就是偷或者不偷,所以我们可以创建一个二维的数组,并用0表示不偷,1表示偷数组的长度:这个实际上就是你房子的数量;状态转移方程:当你在第i家时,选择不偷时,dp[i][0]就是选择dp[i-1]中最大的一个,选择偷的话,前面那家肯定不能偷,因此dp[i][1] = nums[i] + dp[i-1][0]。所以有状态转移方程: dp[i][0] = Max(dp[i - 1]原创 2020-09-29 23:49:25 · 2006 阅读 · 0 评论 -
经典dp--不同路径系列之Go写法
经典dp–不同路径系列之GO写法uniquePaths这是一个dp问题,最重要的是需要找到一个状态转移方程。从题目可见,机器人只能向右或者向左走,因此对于到达某一个节点,其主要有两条路径可以到达,也就是说从上面的节点以及左边的节点过来。而假定我们有一个dp二维数组,大小为m x n, 然后存储的值是到达这个节点的路径数目,根据上面所述,我们有状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1] 特别地,这里可以使用优化空间版本的dp数组,也就是一个大小为n的一位数原创 2020-10-04 10:33:57 · 600 阅读 · 0 评论 -
经典dp--字符串系列之Go写法
字符串系列–经典dp系列GO写法在这里我目前碰到了两个比较像的字符串dp处理的问题,分别是编辑距离和最长公共子序列,这两个问题结构很相似,都是借助二维数组来保存状态,根据这种状态来转移更新。下面来看看这两个题怎么解吧。PS:画个矩阵出来比一比更加形象生动!!!Edit Distance该题编辑距离,这道题连接和题目描述见原链接(标题)首先,我们定义一个dp数组,大小为m = len(word1), n = len(word2)。dp[i][j]的含义表示子串word1[0:i]和word2[0:j原创 2020-10-08 22:16:51 · 610 阅读 · 0 评论 -
算法学习——动态规划常见例题及实现程序
题目来源于此大神:http://blog.csdn.net/tobewhatyouwanttobe/article/details/42805225我是按照该blog来入门dp相关问题的。不断更新中。。。。。。2019/2/25一、数塔问题具体描述见连接:http://acm.hdu.edu.cn/showproblem.php?pid=2084#include <...原创 2019-02-25 21:46:24 · 726 阅读 · 0 评论 -
算法学习——贪心算法 总结
一、贪心算法基本特点求解最优解算法包括一系列步骤 每一步都有一组选择,做出当前最好的选择,通过选择局部最优达到全局最优 但是,贪心不一定能达全局最优,需要严格证明才能使用二、贪心算法的条件贪心选择性。指全局最优解可以通过局部优化解选择得到,即一个全局最优解一定包括局部解 优化子结构。一个问题的优化解包括子问题的优化解。(与动态规划优化子结构相对比,类似,但不一样)三、贪心算法正确...原创 2019-02-25 16:44:56 · 840 阅读 · 0 评论 -
算法学习——动态规划 总结
一、动态规划特点。求解目标具有最优解。 目标问题的最优解可以分解为各个子问题的最优解。 大问题分解为若干小问题后,这些小问题之间还有相互重叠的更小的子问题。 从上往下分析问题,从下往上求解问题。 PS:总结于 《剑指offer》author:何海涛二、动态规划条件。优化子结构。即一个问题的优化解包含子问题的优化解。作用:可以缩小子问题集合;保证了可以从下而上求解问题呢 ...原创 2019-02-22 14:22:07 · 3257 阅读 · 0 评论 -
算法学习——最短路径算法
1.Dijkstra邻接矩阵:#include<bits/stdc++.h>using namespace std;const int MaxV = 1000;const int INF = 10000000;int G[MaxV][MaxV];int dis[MaxV];int charge[MaxV];bool vis[MaxV] = {false};...原创 2019-03-18 15:52:11 · 198 阅读 · 0 评论 -
算法学习—— 动态规划 状态方程
一、最大连续子序列和:dp[i] = max{ A[i] , dp[i-1] + A[i] };边界:dp[0] = A[0];二、最长不下降序列dp[i] = max{1,dp[j] +1} 其中j = 1,2,3......i-1; 且有A[i]>A[j];边界:dp[i] = 1;三 、最长公共子序列有长度:str1 = n; st...原创 2019-03-19 22:47:13 · 3256 阅读 · 0 评论 -
算法 常见数学问题
一、最大公约数。//gcd()int gcd(int a,int b){ if(b == 0) return a; else return gcd(b,a%b);}//非递归形式:int gcd(int a,int b){ int tmp; while(b!=0){ tmp = a; a = b; b...原创 2019-03-19 21:05:28 · 632 阅读 · 0 评论