
算法总结
文章平均质量分 61
五行散人
这个作者很懒,什么都没留下…
展开
-
13.回溯法
回溯法背景回溯法(backtrack)常用于遍历列表所有子集,是 DFS 深度搜索一种,一般用于全排列,穷尽所有可能,遍历的过程实际上是一个决策树的遍历过程。时间复杂度一般 O(N!),它不像动态规划存在重叠子问题可以优化,回溯算法就是纯暴力穷举,复杂度一般都很高。模板result = []func backtrack(选择列表,路径): if 满足结束条件: result.add(路径) return for 选择 in 选择列表:原创 2021-05-17 09:25:59 · 167 阅读 · 0 评论 -
12.二叉搜索树
二叉搜索树定义每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值。每个节点中的值必须小于(或等于)存储在其右子树中的任何值。应用validate-binary-search-tree验证二叉搜索树/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */func i原创 2021-05-17 09:25:23 · 134 阅读 · 0 评论 -
11.滑动窗口思想
滑动窗口思想模板/* 滑动窗口算法框架 */void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid = 0; while (right < s.size()) { // c 是将移入窗口的字符原创 2021-05-17 09:24:41 · 164 阅读 · 0 评论 -
10.递归思维
递归思维介绍将大问题转化为小问题,通过递归依次解决各个小问题示例reverse-string编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。func reverseString(s []byte) { res := make([]byte, 0) reverse(s, 0, &res) for i := 0; i < len(s); i++ { s[i] = res[i] }}fu原创 2021-05-16 19:44:52 · 310 阅读 · 0 评论 -
8.排序算法
排序算法常考排序快速排序func QuickSort(nums []int) []int { // 思路:把一个数组分为左右两段,左段小于右段 quickSort(nums, 0, len(nums)-1) return nums}// 原地交换,所以传入交换索引func quickSort(nums []int, start, end int) { if start < end { // 分治法:divide pivot原创 2021-05-16 19:43:30 · 114 阅读 · 0 评论 -
7.二分搜索
二分搜索二分搜索模板给一个有序数组和目标值,找第一次/最后一次/任何一次出现的索引,如果没有出现返回-1模板四点要素1、初始化:start=0、end=len-12、循环退出条件:start + 1 < end3、比较中点和目标值:A[mid] ==、 <、> target4、判断最后两个元素是否符合:A[start]、A[end] ? target时间复杂度 O(logn),使用场景一般是有序数组的查找典型示例binary-search给定一个 n 个元素有序原创 2021-05-16 19:42:40 · 127 阅读 · 0 评论 -
6.二进制
二进制常见二进制操作基本操作a=0a=a00=a^a由上面两个推导出:a=abb交换两个数a=a^bb=a^ba=a^b移除最后一个 1a=n&(n-1)获取最后一个 1diff=(n&(n-1))^n常见题目single-number给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。func singleNumber(nums []int) int { // 10 ^10 == 00原创 2021-05-16 19:41:38 · 156 阅读 · 0 评论 -
5.栈和队列
栈和队列简介栈的特点是后入先出image.png根据这个特点可以临时保存一些数据,之后用到依次再弹出来,常用于 DFS 深度搜索队列一般常用于 BFS 广度搜索,类似一层一层的搜索Stack 栈min-stack设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。思路:用两个栈实现,一个最小栈始终保证最小值在顶部type MinStack struct { min []int stack []int}/** initialize原创 2021-05-16 19:40:58 · 117 阅读 · 0 评论 -
4.链表
链表基本技能链表相关的核心点null/nil 异常处理dummy node 哑巴节点快慢指针插入一个节点到排序链表从一个链表中移除一个节点翻转链表合并两个链表找到链表的中间节点常见题型remove-duplicates-from-sorted-list给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。func deleteDuplicates(head *ListNode) *ListNode { current := head for cur原创 2021-05-16 19:40:21 · 136 阅读 · 0 评论 -
3.二叉树
二叉树知识点二叉树遍历前序遍历:先访问根节点,再前序遍历左子树,再前序遍历右子树 中序遍历:先中序遍历左子树,再访问根节点,再中序遍历右子树 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问根节点注意点以根访问顺序决定是什么遍历左子树都是优先右子树前序递归func preorderTraversal(root *TreeNode) { if root==nil{ return } // 先访问根再访问左右 fmt.Println(ro原创 2021-05-16 19:39:46 · 128 阅读 · 0 评论 -
2.算法快速入门
算法快速入门数据结构与算法数据结构是一种数据的表现形式,如链表、二叉树、栈、队列等都是内存中一段数据表现的形式。 算法是一种通用的解决问题的模板或者思路,大部分数据结构都有一套通用的算法模板,所以掌握这些通用的算法模板即可解决各种算法问题。后面会分专题讲解各种数据结构、基本的算法模板、和一些高级算法模板,每一个专题都有一些经典练习题,完成所有练习的题后,你对数据结构和算法会有新的收获和体会。先介绍两个算法题,试试感觉~示例 1strStr给定一个 haystack 字符串和一个 needle原创 2021-05-16 19:35:30 · 195 阅读 · 0 评论 -
1.go 语言入门
go 语言入门基本语法Go 语言圣经常用库切片go 通过切片模拟栈和队列栈// 创建栈stack:=make([]int,0)// push压入stack=append(stack,10)// pop弹出v:=stack[len(stack)-1]stack=stack[:len(stack)-1]// 检查栈空len(stack)==0队列// 创建队列queue:=make([]int,0)// enqueue入队queue=append(queue,10)/原创 2021-05-16 19:34:43 · 200 阅读 · 0 评论