数据结构与算法
文章平均质量分 76
pengfeierzhang
这个作者很懒,什么都没留下…
展开
-
面试题: k个一组翻转单链表
题目地址 链表中的节点每k个一组翻转 注意点: 本题考频很高!!! 题目要求空间复杂度为O(1)O(1)O(1), 因此无法使用递归 本题可以借鉴翻转单链表一题,只是翻转单链表不需要引入辅助的头结点,为什么本题需要引入单独的辅助的头结点,下文会讲解。 对于上面注意点的第一条,要封装的函数如下: 注意下面的函数是左闭右开即只翻转绿色的部分: //翻转一段链表(左闭右开) //翻转从start到end之间的链表 public ListNode ReverseList(ListNod原创 2021-03-09 23:30:04 · 229 阅读 · 0 评论 -
并查集
并查集的用途 主要用于不相交集合的合并和查询。这种数据结构主要用来进行表示集合信息,用以实现确定集合中含有哪些元素,判断两个元素是否在同一个集合中,求集合中元素的数量。 求连通分量的个数 并查集的特点 树的特点(双亲表示法):对于一个集合来说,一个集合可以被构建成一棵树,只是这棵和常规数据结构中的树不同的是:每一棵树的结点没有左、右孩子,而是只有一个父结点,即每一个结点(除了根节点)都会保存其父亲结点的信息,而该树的根节点被认为是集合的首领(该首领方便进行集合的合并操作即树的合并)。 合并:集合的合并原创 2021-02-09 15:12:20 · 144 阅读 · 0 评论 -
对链表进行使用快速排序和归并排序
对单链表进行快速排序 class Solution { public: //交换两个链表结点的元素 void swap(ListNode* a, ListNode* b){ int temp = a->val; a->val = b->val; b->val = temp; } //对链表进行快速排序 //首先进行书写partition函数 ListNode* partition(List原创 2020-08-12 15:46:51 · 606 阅读 · 0 评论 -
合并多个有序数组
合并多个有序的数组。 #include <iostream> using namespace std; double mySqrt(int x) { double target = x; if(x<=1) return target;//平方根是其本身 double l = 0; double r = target; while(l<r){ double mid = (l+r)/2; double ans = mid * mid; c原创 2020-08-27 17:18:54 · 440 阅读 · 0 评论 -
快速排序递归版和非递归版
快速排序的关键主要就是partition函数,即将一个数组进行划分为左边的所有树都小于pivot,右边的所有的所有数都大于pivot,该partion函数有两种实现,双指针两边夹逼实现,还有一种就是双指针同向前进,本文主要采用双指针同向前进的方式。 快速排序的非递归实现主要就是用栈保存每一个待排序子串的首尾元素下标,下一次while循环时取出这个范围,对这段子序列进行partition操作。 #include <iostream> #include <vector> #include原创 2020-08-21 01:03:00 · 171 阅读 · 0 评论 -
如何记住二分查找的套路代码
问题定义:如何不死记二分的写法 以下的讨论都是基于问题的解是存在的前提下。 场景一: 对于二分查找最常见的应用场景就是在一个有序的数组中寻找某个下标使得其对应的值等于某个指定的target。如下的代码是最简单的,也会是最容易记忆的一种写法。 public static int binarySearch(int[] arr, int target){ int l = 0; ...原创 2020-04-29 22:32:59 · 172 阅读 · 0 评论 -
单词查找树:trie树
trie的特点 是一个多叉查找树即每个结点的分支数量可能为多个。trie树的结点设计如下: struct TrieNode { bool isEnd; //该结点是否是一个串的结束 TrieNode* next[26]; //字母映射表 }; 注意TrieNode结点中并没有直接保存字符值的数据成员。TrieNode* next[26]中保存了对当前结点而言下一个可能出现的所有字符的链接,因此我们可以通过一个父结点来预知它所有子结点的值 Trie 中一般都含有大量的空链接 trie原创 2020-09-25 17:20:33 · 81 阅读 · 0 评论