数据结构和算法笔记

这篇具有很好参考价值的文章主要介绍了数据结构和算法笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <iostream>
#include <vector>
#include <stack>
#include <deque>

using namespace std;

// 单调栈
vector<int> nextGreaterElement(vector<int>& nums)
{
    vector<int> ans;
    stack<int> s;
    for (int i = nums.size() - 1; i >= 0; i--) {
        while (!s.empty() && s.top() < nums[i]) {
            s.pop();
        }
        ans[i] = s.empty() ? -1 : s.top();
        s.push(nums[i]);
    }
    return ans;
}

// 单调队列
class MonotomicQueue{
    deque<int> data;
public:
    void push(int n) {
        while (!data.empty() && data.back() > n) {
            data.pop_back();
        }
        data.push_back(n);
    }
    void pop(int n) {
        if (data.empty() && data.front() == n)
            data.pop_front();
    }
    int min() {
        return data.front(); 
    }
};

// 二叉堆(大根堆/小根堆)、优先队列
class MaxPQ {
    vector<int> pq;
    int N = 0;  // 大根堆容量
    
    int parent(int root) {
        return root / 2;
    }
    int left(int root) {
        return 2 * root;
    }
    int right(int root) {
        return 2 * root + 1;
    }
    
    bool less(int i, int j) {
        return pq[i] < pq[j];
    }
    void exch(int i, int j) {
        swap(pq[i], pq[j]);
    }
    // 上浮第k个节点
    void swim(int k) {
        while (k > 1 && less(parent(k), k)) {
            exch(parent(k), k);
            k = parent(k);
        }
    }
    // 下沉第k个节点
    void sink(int k) {
        while (left(k) <= N) {
            // 默认左子树值较大
            int older = left(k);
            // 如果右子树存在,并且大于左子树,更新older
            if (right(k) <= N && less(older, right(k))) {
                older = right(k);
            }
            // 节点k比两个子孩子都大,就不必下沉了
            if (less(older, k)) break;
            exch(k, older);
            k = older;
        }
    }
    
public:
    void insert(int e) {
        N++;
        pq[N] = e;
        swim(N);
    }
    int delMax() {
        int max = pq[1];
        // 交换栈顶和栈底最后一个节点
        exch(1, N);
        N--;  // 删除最有一个节点
        sink(1);  // 下沉栈顶节点
        return max;
    }
    // 返回当前队列最大节点
    int max() {
        return pq[1];
    }
};

// 归并排序
vector<int> temp;
void merge_sort(vector<int>& nums, int l, int r) {
    if (l >= r)
        return;
    
    int mid = (r + l) >> 1;
    merge_sort(nums, l, mid);         // 递归排列左半边
    merge_sort(nums, mid + 1, r);     // 递归排列右半边
    int k = l, p1 = l, p2 = mid + 1;  // 合并左右两测
    while ((p1 <= mid) || (p2 <= r)) {
        if ((p2 > r) || (p1 <= mid && nums[p1] < nums[p2])) {
            temp[k++] = nums[p1++];
        } else {
            temp[k++] = nums[p2++];
        }
    }
    for (int i = l; i <= r; i++) nums[i] = temp[i];  // 将排序结果拷回原数组
}

// 二叉树遍历模板
typedef struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
} TreeNode;
// 思路:
// 1.遍历
// 2.分解问题
/************ 遍历 ***********/
// 辅助外部变量
void traverse(TreeNode *root) {
    if (root == NULL)
        return;
    
    /****** 前序遍历位置 ******/
    traverse(root->left);
    /****** 中序遍历位置 ******/
    traverse(root->right);
    /****** 后续遍历位置 ******/
}
/************ 分解问题 ***********/
// 函数定义:输入以root为根的二叉树,返回这颗二叉树的最大深度
int MaxDepth(TreeNode *root) {
    if (root == NULL)
        return 0;
    /****** 前序遍历位置 ******/
    int ldep = MaxDepth(root->left);
    /****** 中序遍历位置 ******/
    int rdep = MaxDepth(root->right);
    /****** 后序遍历位置 ******/
    return max(ldep, rdep) + 1;
}

// 二叉搜索树
// 特性:所有左子树节点均小于根节点,所有右子树节点均大于根节点
int searchBST(TreeNode *root, int target) {
    if (root)
        return -1;
    
    if (root->val == target) {
        return root->val;
    }
    if (root->val < target) {
        return searchBST(root->right, target);
    }
    if (root->val > target) {
        return searchBST(root->left, target);
    }
    return -1;
}

// 动态规划
// 1最优解(最大或最小值)
// 2方案总数
// 3可行性
// 4最长子数组
// 5最长子序列
// 6背包系列问题
// 7打家劫舍系列问题
// 8股票交易系列问题

// 二分算法模板
int findTarget(vector<int>& nums, int target) {
    int l = 0, r = nums.size() - 1;
    while (l <= r) {
        int mid = l + (r - l) / 2;
        if (nums[mid] > target) {
            r = mid - 1;
        } else if (nums[mid] < target) {
            l = mid + 1;
        } else {
            return nums[mid];
        }
    }
    return -1;
}

// 快速排序

// 并查集

// 字典树

// 前缀和 树状数组文章来源地址https://www.toymoban.com/news/detail-794434.html

到了这里,关于数据结构和算法笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构和算法笔记1:滑动窗口

    在一些数组或者字符串我们需要遍历子序列,可能要用到两个指针(我们称为起始指针和终止指 针)进行双层遍历,内层终止指针满足条件时跳出内层循环,然后起始指针前进,回溯终止指针到起始指针,以此继续进行遍历,然而这样效率比较低,我们可能进行了很多不必要

    2024年02月07日
    浏览(31)
  • 【王道考研】王道数据结构与算法详细笔记(全)

    目录 第一章 数据结构绪论  1.1 数据结构的基本概念 1.2 数据结构的三要素 1.2.1. 数据的逻辑结构 1.2.2. 数据的存储结构(物理结构) 1.2.3. 数据的运算 1.2.4. 数据类型和抽线数据类型 1.3 算法的基本概念 1.4 算法的时间复杂度 1.5 算法的空间复杂度 第二章 线性表 2.1 线性表的定

    2024年02月08日
    浏览(53)
  • 【学习笔记】数据结构算法文档(类C语言)

    1.1.1 线性表的顺序存储表示 1.1.2 顺序表中基本操作的实现 1.1.2.1 初始化 1.1.2.2 取值 1.1.2.3 查找 1.1.2.4 插入 1.1.2.5 删除 1.1.2.6 计数 1.2.1 单链表的定义和表示 ★ 关于结点 1.2.2 单链表基本操作的实现 1.2.2.1 初始化 1.2.2.2 取值 1.2.2.3 查找 1.2.2.4 插入 1.2.2.5 删除 1.2.2.6 前插法创建单

    2024年02月07日
    浏览(44)
  • 读书笔记-《数据结构与算法》-摘要8[桶排序]

    桶排序和归并排序有那么点点类似,也使用了归并的思想。大致步骤如下: 设置一个定量的数组当作空桶。 Divide - 从待排序数组中取出元素,将元素按照一定的规则塞进对应的桶子去。 对每个非空桶进行排序,通常可在塞元素入桶时进行插入排序。 Conquer - 从非空桶把元素

    2024年01月18日
    浏览(43)
  • 读书笔记-《数据结构与算法》-摘要4[插入排序]

    核心:通过构建有序序列,对于未排序序列,在已排序序列中从后向前扫描(对于单向链表则只能从前往后遍历),找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间) 从第一个元素开始,该元素可认为已排序 取下一个元素,对已排序数组从后往前扫描 若从

    2024年02月04日
    浏览(37)
  • 【软考程序员学习笔记】——数据结构与算法基础

    目录  🍊一、数据结构概念和分类 🍊二、数组特点存储方式 🍊三、矩阵 特殊矩阵 非特殊矩阵 🍊四、栈和队列 🍊 五、二叉树的性质 🍊六、二叉树的遍历 (1)前序遍历(先根遍历,先序遍历) (2)中遍历(中根遍历) (3)后序遍历(后根遍历,后序遍历) 🍊七、二叉排序树 🍊八、

    2024年02月12日
    浏览(62)
  • 【零基础】学python数据结构与算法笔记14-动态规划

    学习python数据结构与算法,学习常用的算法, b站学习链接 动态规划在基因测序、基因比对、hmm 有应用场景。 从斐波那契数列看动态规划 练习: 使用递归和非递归的方法来求解斐波那契数列。 这种非递归求斐波那契数,可以看成是一个动态规划思想,每次都会把重复子问

    2023年04月09日
    浏览(45)
  • 读程序员的制胜技笔记02_算法与数据结构

    3.1.1.1. 根据你的需要,可以有更智能的算法 3.1.3.1. 算法本身并不意味着它很聪明 3.2.1.1. public static bool Contains(int[] array, int lookFor) { for (int n = 0; n < array.Length; n++) {        if (array[n] == lookFor) {            return true;        }    }    return false; } 3.3.1.1. public sta

    2024年02月06日
    浏览(62)
  • 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    图的遍历指从图中某一顶点出发(任意一个顶点都可以作为访问的起始顶点),按照某种遍历方法,对图中所有的顶点访问一次且只访问一次。图与树不一样,其中一个顶点可能与多个顶点相连,所以需记录已访问过的顶点,当访问一个顶点后,考虑如何选取下一个要访问的

    2024年02月05日
    浏览(53)
  • 数据结构与算法之美学习笔记:48 | B+树:MySQL数据库索引是如何实现的?

    本节课程思维导图: 作为一个软件开发工程师,你对数据库肯定再熟悉不过了。作为主流的数据存储系统,它在我们的业务开发中,有着举足轻重的地位。在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那你是否思考过,数据库

    2024年01月16日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包