![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
ji_r
这个作者很懒,什么都没留下…
展开
-
二叉搜索树和有序数组的转换
二叉搜索树的特点:中序遍历的序列是一个有序序列/数组。这里主要展示有序数组转换为二叉搜索树,但是这样的二叉搜索树为多个。所以这里可以参看leetcode 108.将有序数组转换为二叉搜索树,加上了“平衡的条件”,尽管此时二叉搜索树的个数还是多个,但是在构造BST时很方便。只需要“不断的折半”即可。参考代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode原创 2020-07-17 00:06:13 · 729 阅读 · 0 评论 -
以1-N为节点的二叉搜索树的个数和生成对应的二叉搜索树
输入: 3输出: 5解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树:要满足是二叉搜索树,以i为root, 左子树的个数为i-1(比i小的数),右子树的个数为n-i(比i大的数)。此时如果出现个数为0,表示空树,记作1;只有一个节点,表示只有根的树,也记作1.f(i)=f(i-1)*f(n-i) (一一组合配对构成整个二叉搜索树)所以1-n为节点构成的二叉搜索树的个数为:参看代码:class Solution {public: int numTr原创 2020-07-16 23:44:07 · 986 阅读 · 0 评论 -
数组中第K大(小)的元素
在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。这是一道排序问题?但是当数组元素N很大时,采用一般O(N^2)的排序算法(如冒泡排序)一定会超时。所以这里可以使用快排和堆排。这里快排和堆排的思想就不详细介绍了,有兴趣的可以去看我的其他文章或者直接baidu一下。1.直接快速排序,对整个数组进行排序lass Solution {public: int findKthLargest(vector<int..原创 2020-07-06 22:37:18 · 397 阅读 · 0 评论 -
拓扑排序
什么是拓扑排序?此处采用百度百科的解释:执行步骤:循环执行以下两步,直到不存在入度为0的顶点为止。(1) 选择一个入度为0的顶点并输出之;(2) 从网中删除此顶点及所有出边。循环结束后,若输出的顶点数小于网中的顶点数,则输出“有环路”信息,否则输出的顶点序列就是一种拓扑序列。一个简单的实例(过程):实现:利用邻接矩阵表示两者的关系。将上述示例中的图用邻接矩阵表示:参考代码:#include<iostream>#include<cs原创 2020-06-24 00:36:50 · 264 阅读 · 0 评论 -
链表中的双指针
链表中的双指针,一般是指初始时设置两个移动指针,它们可能以不同的初始状态或不同的移动方式进行移动。1.删除链表的倒数第N个节点题目描述:给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n保证是有效的。进阶:你能尝试使用一趟扫描实现吗?思路:不同的初始状态,一个指针从头开始移动,一个...原创 2020-06-23 11:59:19 · 1195 阅读 · 0 评论 -
滑动窗口(一)
什么是滑动窗口?大致就是如下图:维护left和right两个指针,在整个区间内,通过改变左右指针的移动,找到满足条件的区间(很多时候是最佳区间)。所以窗口的大小是在移动过程中改变的。目的:常用于将嵌套的循环问题,转换为单循环问题,降低时间复杂度。常用于解决数组/字符串的子元素问题。问题1及解决思路:1.先计算出前K个元素的和(即arr[0] + ...+ arr[k-1])。2.从i=k to arr.size() - 1, sum += arr[i] - arr[i-k]; /原创 2020-06-18 21:37:11 · 342 阅读 · 0 评论 -
单调栈
什么是单调栈?这个概念是在leetcode做题时接触的,就是通过栈的push()和pop()操作,维护一个有序的序列(依次出栈的元素)。如:7 4 3 8 10 9 13下面则通过leetcode中的题目来说明它如何在问题中使用?739. 每日温度题目描述:请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0来代替。例如,给定一个列表temperatures = [73, 74, 75...原创 2020-06-12 21:06:25 · 202 阅读 · 0 评论 -
并查集(Union-find set)
它是一种维护集合的数据结构,它的名字"并" "查" "集" 。即 union / find / set。并查集产生的每个集合都是一棵树(tree) 。基本操作:1.合并两个集合union。2.判断两个元素是否在一个集合中find。实现:利用一个数组int father[N];其中父节点自身也在1-N之中用来记录父节点:即father[i]表示的i节点的父亲节点。当a和b的father[a]==father[b]时,a和b才是联通的。初始化:void init(int fa[], i..原创 2020-06-08 20:13:36 · 381 阅读 · 0 评论 -
LRU缓存机制
本文借助leetcode中的一道题目,来介绍LRU的相关知识,以及如何实现它。leetcode 146:问题:运用你所掌握的数据结构,设计和实现一个LRU(最近最少使用)缓存机制。它应该支持以下操作: 获取数据get和写入数据put。获取数据get(key):如果密钥(key)存在于缓存中,则获取密钥的值(总是正数), 否则返回-1。写入数据put(key, value):如果密钥不存...原创 2019-11-02 12:46:25 · 223 阅读 · 0 评论 -
蓄水池采样问题(Reservoir sampling question)
问题: 在给定的但未知其大小的数据集中,随机等概率的抽取一个元素。分析: 如果知道数据集的大小,可以直接rand() % len得到一个确切的位置。所以未知长度时,即可使用蓄水池采样。算法思路: 总是选择第一个对象,以的概率选中第二个数据,依次类推... 以的概率选中第m个数据。此时可以保证被选中的概率为。第m个被选中,那么就是说后面的都不被选中(第m个数据不被选中,前m - 1个随机选...原创 2019-10-15 23:25:21 · 226 阅读 · 0 评论 -
前序序列和中序序列、中序序列和后序序列生成二叉树
今天分享的内容,也是结合leetcode中的两题,大家可以理清思路后可以去平台做一下题,检验一下成果。首先我们还是得理解三种遍历方式的特征:preorder: 先序遍历中,先遍历root,也就是说在先序序列中的第一个元素即原二叉树的root节点。同理,在postorder中,由于先遍历left & right 也就是说后序序列中的最后一个元素是二叉树的root节点。inor...原创 2019-10-27 16:06:14 · 2986 阅读 · 0 评论 -
树的三种遍历方式的实现(递归&非递归&C++)
本篇文章结合结合leetcode(94、144、145 二叉树的中序、前序、后序遍历方式)中的三道题,介绍树的前序、中序、后序遍历的递归和非递归实现。先简单介绍一下,三种方式遍历时的特征:preorder: root left right.inorder: left root rightpostorder: left right root描述一个二叉树:/*** Defi...原创 2019-10-27 15:33:04 · 500 阅读 · 0 评论