刷题算法记录
为了准备考试,记录下刷题过程
木木夕夕山
这个作者很懒,什么都没留下…
展开
-
广度优先搜索(BFS)
一、概述BFS问题的本质就是让你在一幅图中找到从起点 start 到终点 target 的最近距离,即用来解决最短路径问题。第一次遍历到目的节点时,所经过的路径是最短路径。几个要点:只能用来求解无权图的最短路径问题 队列:用来存储每一层遍历得到的节点 标记:对于遍历过的结点,应将其标记,以防重复访问二、框架// 计算从起点 start 到终点 target 的最近距离int BFS(Node start, Node target) { Queue<No...原创 2022-02-18 17:41:04 · 193 阅读 · 0 评论 -
深度优先搜索(DFS)
一、概念深度优先搜索就是回溯算法。二、解题框架回溯算法解题套路框架 :: labuladong的算法小抄三、leetcode例题leetcode-46-全排列 vector<vector<int>> res; void backtrace(vector<int>& nums, vector<int>& path, vector<bool> used) { // 满足结束条件原创 2022-02-17 16:39:16 · 349 阅读 · 0 评论 -
二分查找算法
一、概念二分查找要求数组1)采用顺序存储结构,元素能够随机读取;2)必须按照关键字大小有序排列,从而可以在O(log2n)的时间复杂度解决问题。二分查找的常用场景:寻找一个数、寻找左侧边界、寻找右侧边界。二、二分查找的框架int binarySearch(vector<int> nums, int target) { int left = 0, right = ...; while(...) { int mid = (right + left) /原创 2022-02-14 21:57:42 · 201 阅读 · 0 评论 -
数据结构——单调栈
leetcode:1509、248、84、85、42一、单调栈概念1、单调栈通过维持栈内值的单调递增(递减)性,在O(n)的时间内处理需要大小比较的问题。作用:可以以O(1)的时间复杂度得知某个位置左右两侧比它大(或小)的数的位置,当你需要高效率获取某个位置左右两侧比它大(或小)的数的位置的时候用到单调栈。2、单调递增(递减)栈单调递增栈:找到左起第一个比当前数字小的元素for (int i = 0; i < T.size(); ++i) {while(! st.emp原创 2022-02-14 20:41:37 · 315 阅读 · 0 评论 -
前缀和+哈希表优化
使用场景: 当需要大量判断某些区间的某一性质时使用。比如找出数组nums中满足某一性质的区间的个数,比如找出数组中最长的满足某一性质的区间,这些区间有O()个,这时就要想到用前缀和。例如求一个长度为n的序列的区间[j+1, i]的某一性质时,通过pre[i]-pre[j]可以以O(1)的时间复杂度判断这个区间是否具有这一性质。显然,这里的pre[i]-pre[j]也是狭义的。广义上来讲,凡是以pre[i]和pre[j]为参数,以O(1)时间复杂度得出判断结果的函数都可以。题目举例...原创 2022-02-12 20:27:22 · 593 阅读 · 0 评论 -
差分算法介绍
一、基本概念差分算法是前缀和算法的逆运算,可以快速的对数组的某一区间进行计算操作。 例如,有一数列 a[1],a[2],.…a[n],且令 b[i] = a[i]-a[i-1],b[1]=a[1],那么就有a[i] = b[1]+b[2]+.…+b[i] = a[1]+a[2]-a[1]+a[3]-a[2]+.…+a[i]-a[i-1],此时b数组称作a数组的差分数组,换句话来说a数组就是b数组的前缀和数组 例: 原始数组a:9 3 6 2 6 ...原创 2022-02-12 20:18:07 · 5486 阅读 · 0 评论