
数据结构
~AC~
这个作者很懒,什么都没留下…
展开
-
01背包-go实现
func pack(weight, value []int, cap int) int { dp := make([][]int, 0)//dp[i][j]表示容量j下前i个物品最大的value for i := 0; i <= len(value); i++ { dp = append(dp, make([]int, cap + 1)) } for i := 1; i <= cap; i++ { for j := 1; j <= len(weight); j++ {原创 2021-09-29 18:17:39 · 170 阅读 · 0 评论 -
JAVA实现KMP
class KMP { //计算next数组 private static int[] getNextArray(String str) { if (str.length() == 1) { return new int[]{0}; } int[] res = new int[str.length()]; ...原创 2020-03-14 17:17:29 · 166 阅读 · 0 评论 -
丑数(剑指offer)---C++实现
《参考程序员面试金典》伪代码如下1)初始化array和队列:Q2 Q3 Q52)将1插入array3)分别将12、13 、1*5插入Q2 Q3 Q54)令x为Q2 Q3 Q5中的最小值,将x添加至array尾部5)若x存在于:Q2:将 x * 2、x * 3、x5 分别放入Q2 Q3 Q5,从Q2中移除xQ3:将 x * 3、x5 分别放入Q3 Q5,从Q3中移除xQ5:将 x ...原创 2019-05-13 21:06:53 · 226 阅读 · 0 评论 -
判断平衡二叉树(剑指offer)---C++实现
解法一:前序(中序、后序)遍历二叉树,计算每个结点左右子树高度,查看每个结点是否满足平衡二叉树性质。 复杂度太高!O(nlgn)解法二:在求解树高度的过程中,加入一个标志位flag,只需要遍历一次即可。复杂度O(n)int getDepth(TreeNode* root, bool& flag){ if(root){ int leftDepth = getD...原创 2019-05-13 19:48:50 · 638 阅读 · 0 评论 -
kmp衍生题 添加字符使字符串包含2个原始子串
题目:已知一个字符串 向末尾添加字符,使新的字符串包含2个原始子串 ,例如原始串为aba 只需添加一个b即可, 若原始子串为abc 则需添加abc,若原始子串为aaa,则只需要加一个a即可。 #include <iostream> #include <string> #include <vector> using namespace...原创 2018-12-24 12:54:30 · 176 阅读 · 0 评论 -
二叉树层次遍历(遍历过程返回每层的节点数)---C++实现
规范了输出格式,每行末尾和最后一行没有多余的换行或空格void traverseByLevel(node* root) { if (root) { queue<node*>que; que.push(root); int level = 1; //记录当前层数 while (que.size()) { queue<node*>assist; ...原创 2019-05-02 19:53:34 · 1409 阅读 · 0 评论 -
N皇后问题---C++实现
利用dfs和回溯思想,关键是要利用好3个条件:1.所在列没有皇后2.所在位置主对角线上没有元素3.所在位置斜对角线上没有元素 利用状态数组保存这3个条件的信息int num = 0;void dfs(vector<vector<int> >& res,vector<vector<int> >&flag ,int leve...原创 2019-05-02 19:15:14 · 235 阅读 · 0 评论 -
二叉搜索树第K小(大)的结点---C++实现
二叉搜索树中序遍历递增,要得到第K小的数明显进行中序遍历即可,而第K大的数类似,可以通过中序遍历的逆序来得到。// 调用node* res = getKthMinNodeOfBST(root,k);node* getKthMinNodeOfBST(node* root,int k) { static int curNum = 1; //这里使用静态变量记录当前的位置,注意静态变量只...原创 2019-05-02 14:26:23 · 568 阅读 · 0 评论 -
数组中两个数的最大异或值(LeetCode 421)---C++实现
利用字典树,将一个数31位信息存入字典树。然后遍历数组,将每个数取反,在字典树中寻找与取反后的数最匹配的即为数组任一个数与该数异或的最大值。#include <iostream>using namespace std;/*数组中两数异或最大值*/typedef struct Trie { struct Trie* datas[2]; Trie() { dat...原创 2019-04-18 10:42:24 · 975 阅读 · 0 评论 -
求一个二叉树中最大的二分搜索子树---C++实现
#include "pch.h"#include <iostream>#include <algorithm>#include <math.h>#include <stack>using namespace std;/*判断完全二叉树CBT*/typedef struct btree { struct btree* lchil...原创 2019-04-15 13:09:47 · 322 阅读 · 0 评论 -
判断完全二叉树---C++实现
//二叉树层次遍历 借助队列实现bool isCBT(node* root) { if (root) { queue<node*>que; que.push(root); bool isLeaf = false; while (que.size()) { node* p = que.front(); que.pop(); //如果左子树不存在 ...原创 2019-04-15 10:43:45 · 660 阅读 · 0 评论 -
判断平衡二叉树AVL---C++实现
//用0标记以该节点为根的树不平衡 否则返回该节点所在树的高度int isAVL(node* root) { if (root) { int left = isAVL(root->lchild); int right = isAVL(root->rchild); if (left == 0 || right == 0) { return 0; } if ...原创 2019-04-15 10:42:40 · 510 阅读 · 0 评论 -
求集合子集---C++实现
思路:int arr[] = { 0,1,2,3,4 };递归遍历整个数组,遍历到第0个位置,我们就求出含有0的所有子集,遍历到第1个位置,我们就求出含有1不含0的所有子集,依次类推,遍历到第3个位置,我们求出含有3而不含0 1 2 的所有子集。 //loc表示当前位置 loc == len为递归终止条件 void getAllSubSet(int* arr, int len, in...原创 2019-05-20 21:25:19 · 3421 阅读 · 0 评论 -
逆序输出链表(递归)---C++实现
**顺序输出链表**void printList(node* head) { if (!head) return; cout << head->data << " "; printList(head->next);}**逆序输出链表**void printListByReverseOrder(node* head) { if (!head)...原创 2019-05-21 10:44:25 · 2427 阅读 · 1 评论 -
合并2个有序链表=> 进阶 合并k个有序链表---C++实现
合并2个有序链表三种方法LeetCode OJ链接(戳我)一般方法有合并2个链表作为前提,再来看这题简直是简单,最简单容易想到该方法。该方法固然可行,但是是两两合并链表,时间复杂度O(nk)(n是链表个数,k是链表长度)空间复杂度O(1)。显然,时间复杂度还不够低,应该优化。node* mergeKLists(vector<node*>& lists) { if...原创 2019-06-22 19:47:59 · 946 阅读 · 0 评论 -
合并两个有序链表(三种方法)---C++实现
方法一:若要求不能对原始链表更改,则必须使用额外空间//使用额外空间来合并链表 不对原始链表做改变node* mergeTwoLinkListWithExtraPlace(node *head1, node *head2) { /*先创建一个头结点 这里用任意的整数都可以 不一定用0 之后返回newHead->next 即可 该方法在很多时候都可以起到简化代码的作用 值得借鉴*/...原创 2019-06-10 08:42:43 · 30560 阅读 · 0 评论 -
双指针的巧妙运用=>接雨水(LeetCode42)---C++实现
注意:此题不是求最大阴影面积思路:1.所接的雨水的多少应该和较小一端有关系(木桶原理),首先两个指针分别指向头尾,小的一方先走2.同时记录左右两边最大值,如果此时的值比最大值还大,则更新最大值,否则可以接雨水。int trap(vector<int>& height) { if (height.size() < 2) { return...原创 2019-06-09 21:09:32 · 821 阅读 · 0 评论 -
加油站(LeetCode134)---C++实现
思路:1.首先介绍一个定理,如果一个整数序列累加和非负,那么一定可以找到一个起点,以该起点开始的序列累加和都非负。2.由1知,只要gas累加和>=cost累加和 解一定存在,反之,一定无解3.进行一次遍历,totalGas记录每个加油站gas[i]-cost[i]的和,curGas记录当前油箱油量,startLoc记录符合要求的起点加油站,所以知道当curGas[i]< 0...原创 2019-06-02 21:28:59 · 544 阅读 · 0 评论 -
子序列组合拳 => 最长连续子序列(leetcode128)&最长递增子序列长度(leetcode300)&最长递增子序列个数(leetcode673)---C++实现
最长连续子序列思路1.空间换时间,利用哈希表存储原始数据。2.遍历原始数组,例如遍历到nums[i],在哈希表中先往num[i]右边找,即num[i] + 1方向;再往左边找,即nums[i] - 1方向。3.优化,每次往左右找时,即可把左右的数在哈希表中删除,防止重复查找 O(n)+O(n)int longestConsecutive(vector<int>&...原创 2019-06-02 10:22:39 · 333 阅读 · 0 评论 -
有序数组中不同平方值的个数(头条面试题)---C++实现
题目:求解一个有序数组不同平方值的个数,{-1,-1,0,1,1}这里平方值只有0,1两种情况,返回2;{-3,-1,0,0,2,3}这里拼房族有0,1,4,9共4中情况,返回4。要求:时间复杂度O(n)空间复杂度O(1)思路:刚开始看到这题,哈希表应该是大多数人都能想到的,且复杂度要求都能满足。就是遍历数组,把每个数的平方放入哈希表中去重即可。但是这种想法很难通过面试,因为有序的...原创 2019-05-29 16:25:21 · 1421 阅读 · 0 评论 -
判断数组中是否存在递增的三元子序列(LeetCode334)---C++实现
思路:记录两个值,一个small,一个big。遍历数组,如果小于small,则更新small,不然如果小于big,则更新big,如果大于big,则存在递增三元子序列bool increasingTriplet(vector<int>& nums) { int small = INT32_MAX; int big = INT32_MAX; int i = 0; w...原创 2019-05-29 10:05:24 · 737 阅读 · 0 评论 -
栈的合法输出顺序---C++实现
利用辅助栈,先初始化辅助栈,将输出序列压入栈中,输入序列依次入栈,如果入栈的顶部元素和出栈一致,则入栈和出栈都弹出元素。bool isLegal(const string& str1, const string& str2) { if (!str1.size() || !str2.size()) return false; stack<char>in, o...原创 2019-05-28 19:48:08 · 2184 阅读 · 0 评论 -
单链表快排(momenta一面题) ---C++面试
下午面了momenta,单链表快排没答出来,是自己能力不够,正好可以查漏。思路:利用节点值域的交换,主要思想还是partiiton,将链表分隔成左右两部分,按照头结点的data(即为tag),左边的data都小于tag,右边的data都大于tagnode* partition(node* &head, node* end) { //链表为空或者head == end 为递归出口...原创 2019-05-23 20:40:07 · 985 阅读 · 0 评论 -
实现一个容器,在O(1)的时间复杂度下实现插入、删除、取随机数(LeetCode380)---C++实现
思路:利用hashMap和vector,hashMap中保存key和key对应在vector中的索引,删除时vector只需要调用resize函数即可删除尾端元素(前提是将需要删除的元素和尾部元素交换)。 class RandomizedSet {public: /** Initialize your data structure here. */ RandomizedSet() ...原创 2019-05-28 10:02:50 · 853 阅读 · 0 评论 -
快排优化---双轴快排(基于JAVA源码)---C++实现
//随机选轴 降低原始数据排列的影响void getTwoRandomNum(vector<int>arr, int left, int right) { if (arr.size() && left < right) { srand(time(0)); int n1, n2; n1 = rand() % (right - left + 1...原创 2019-04-17 13:55:34 · 917 阅读 · 0 评论 -
滑动窗口 数组中连续k个数的最大(小)值---C++实现
例如:int arr[] = {4,2,5,1,9,10,8};int k = 3;=>输出每3个连续的数的最大值5,5,9,10,10,最小值2,1,1,1,8/*滑动窗口*///利用双端队列void getMaxNumOfWindow(int* arr, int len, int k, vector<int>& res) { if (arr &...原创 2019-04-17 10:49:24 · 1675 阅读 · 0 评论 -
面试之pathTree问题---C++实现
#include <iostream>using namespace std;/**path tree*/typedef struct btree { int data; struct btree* lchild; struct btree* rchild; btree(int num) { data = num; lchild = rchild = NU...原创 2019-04-09 19:05:01 · 214 阅读 · 0 评论 -
堆排序 heapsort
堆是一种数据结构,注意不是二叉树,是数组结构,但是处理堆时可以看成完全二叉树,分为大根堆和小根堆。一:首先初始化堆,保证每个root左右孩子的值均不大于它,且该点需对每个子树的root成立//我这里是调整为大根堆 void init(vector<int>&v) { for (int i = v.size() - 1; i > 0; i--) { ...原创 2018-12-29 00:27:44 · 152 阅读 · 0 评论 -
二叉树三种遍历递归及非递归实现
自己把握好入栈出栈时间即可实现#include <iostream>using namespace std;#include <stack>struct btnode { char data; struct btnode *lchild; struct btnode *rchild;};//初始化二叉树void create_btree(btnode *...原创 2018-12-27 19:57:47 · 829 阅读 · 0 评论 -
判断链表是否有环
有环单链表 就是链表尾结点不指向null,而是任意一个单链表结点思路一:利用set 遍历链表,依次将结点放入set中,第一个放入失败的就是第一个入环结点,否则没有环,但是空间复杂度为O(n)。void hoop1( node* head) { set<node*, cmp>s; node *p = head; while (p != NULL) { node* q = ...原创 2018-12-27 18:40:11 · 141 阅读 · 0 评论 -
判断两棵树是否同构
同构 就是结构相同 数据域不管 每个结点度相同下图2棵树是同构的 但是如果左边的树加了红色结点,则不同构思路:二叉树序列化 也可以参考下面的链接https://blog.youkuaiyun.com/qq_42673507/article/details/85260617#include <iostream>#include <string>using namespac...原创 2018-12-26 16:12:01 · 1539 阅读 · 0 评论 -
二叉树 判断一棵树是否是另一棵树的子树
题目:判断判断一棵树是否是另一棵树的子树,子树的意思是只要包含了一个结点,就得包含这个结点下的所有节点。意思就是二叉树结点的值也要相等 如下图2就是1的子树 如果将第二颗树根节点右孩子data改为2 就不是子树了。思路:将二叉树序列化,转化为2个字符串,再利用kmp算法或stl中的find()函数即可,若结点为空用#代表data 二树先序序列化为 1_#8_7##9##_ 用"_"表示一个结...原创 2018-12-26 13:30:00 · 2440 阅读 · 0 评论 -
求二叉树中度为0、1、2结点的个数
void leaf(btree* T,int &count)//count 起计数作用 { if(T == NULL) //跳出递归条件 return; if(T->lchild == NULL&&T->rchild == NULL)//关系运算优先级== 大于逻辑运算&& count++; leaf(T->rchild...原创 2018-11-02 22:42:30 · 8052 阅读 · 2 评论 -
二叉树复制、交换左右子树
复制二叉树 btree* copy(btree* T) { btree* newT = new btree; if(!T) return NULL; else{ newT->lchild = copy(T->lchild); newT->rchild = copy(T->rchild); } newT->data = T->...原创 2018-11-02 22:40:37 · 746 阅读 · 0 评论 -
栈的基本操作(链栈 顺序栈)
栈作为数据结构很重要的一部分 不是很难 但是对于解决很多复杂问题有责非常重要的作用 栈的逻辑结构可以是顺序或者链序的 相对应的是数组实现和指针实现 在这里分别给出相应的源码,博主采用的是面向对象实现。1.链栈#include <iostream>using namespace std;class node{ public: int data; node* next;};...原创 2018-11-01 23:49:16 · 430 阅读 · 0 评论 -
专为新手入门二叉树(C实现)
本篇博客主要涉及二叉树的基本操作,创建,三种遍历,求节点等(C写法)。二叉树作为数据结构的难点,想必让很多人望而生畏,各种复杂的代码和算法实在让人头大,博主也是近期刚接触二叉树,对于二叉树的探究也不是很深刻,所以有纰漏还请体谅。1.首先了解下二叉树二叉树其实是树的一种特殊形式,数据结构中除了图也就是树最难了,二叉树的定义是采用的一种递归方式(如果不了解递归,可自行百度或者看看其他大牛关于递归...原创 2018-10-27 20:15:29 · 12695 阅读 · 9 评论 -
快排 quicksort
快排,采用分治法。void my_swap(vector<int>&v,int a,int b) { int temp = v[a]; v[a] = v[b]; v[b] = temp;}void quickSort(vector<int>&v, int begin, int end) { if (end >= begin) { ...原创 2018-12-29 00:35:34 · 170 阅读 · 0 评论 -
说反话 栈实现
利用栈 能很快解决该问题#include <iostream>#include <stack>using namespace std;#include <string>int main(){ stack<string>str_stack; string s; cin >> s; str_stack.push(s); ...原创 2018-12-24 13:09:06 · 225 阅读 · 0 评论 -
就地反转链表
就地反转,就是空间复杂度O(1)#include <iostream>using namespace std;typedef struct List node;struct List{ int data; struct List* next;};//insert at tailvoid insert(node* &L, int num) { node...原创 2018-12-25 15:39:42 · 139 阅读 · 0 评论 -
AVLTree平衡二叉树---C++实现
#include <iostream>#include <algorithm>#include <queue>using namespace std;/**AVL树*/typedef struct btree{ int data; int height; struct btree* lchild; struct btree* rchil...原创 2019-04-09 12:31:41 · 153 阅读 · 0 评论