![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
机械吴哥123
我很懒,不想写简介
展开
-
【二叉树遍历迭代伪代码】前序遍历、中序遍历、后序遍历
前序遍历伪代码:栈s;p = root;while(p || s 不为空) while(p) 访问p; p右入栈; p = p左; p = s顶; 弹出s顶; }}后序遍历:栈s;p = root;while(p || s 不为空) while(p) 访问p; p左入栈; p = p右; p = s顶; 弹出s顶; }}p逆序输出中序遍历:栈s;p = root;.原创 2020-08-29 15:04:14 · 1861 阅读 · 0 评论 -
面试题 05.08. 绘制直线【位运算】
绘制直线。有个单色屏幕存储在一个一维数组中,使得32个连续像素可以存放在一个 int 里。屏幕宽度为w,且w可被32整除(即一个 int 不会分布在两行上),屏幕高度可由数组长度及屏幕宽度推算得出。请实现一个函数,绘制从点(x1, y)到点(x2, y)的水平线。给出数组的长度 length,宽度 w(以比特为单位)、直线开始位置 x1(比特为单位)、直线结束位置 x2(比特为单位)、直线所在行数 y。返回绘制过后的数组。补充一下知识点:1/计算机中,整数采用补码存储整数int类型,int在计算机中占原创 2020-06-16 17:51:03 · 180 阅读 · 0 评论 -
【leetcode】面试题 03.03. 堆盘子vector_stack的使用
堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。 进阶:实现一个popAt(int index)方法,根据指定的子栈,执行pop操作。当某个栈为空时,应当删除原创 2020-06-15 15:41:43 · 130 阅读 · 0 评论 -
【leetcode】最强边界条件
数组的边界1144. 递减元素使数组呈锯齿状给你一个整数数组 nums,每次 操作 会从中选择一个元素并 将该元素的值减少 1。如果符合下列情况之一,则数组 A 就是 锯齿数组:每个偶数索引对应的元素都大于相邻的元素,即 A[0] > A[1] < A[2] > A[3] < A[4] > ...或者,每个奇数索引对应的元素都大于相邻的元素,即 A[0] < A[1] > A[2] < A[3] > A[4] < ...返回将数组 n原创 2020-06-12 22:47:47 · 242 阅读 · 0 评论 -
【leetcode】二进制手表-经典或回溯题目
回溯,题目的本意就是找组合。返回多少种不同的组合。比如说从N个数里面找出K个数不同的组合。回溯六步骤:1 画出递归树,找到状态变量。本题的状态变量有:给定的总数num,组合的初始值start,以及每种不同的组合所对应的时间,这里用pair<int,int> time接收。因此,递归树可以写成如下:void Time(int sum, int start, pair<int,int>& time)2 找到终止点并处理这里当num = 0 的时候就是终止的时候。原创 2020-06-09 10:46:46 · 199 阅读 · 0 评论 -
【leetcode】二分查找经典题目
1/x 的平方根实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去class Solution {public: int mySqrt(int x) { int l = 0, r = x, ans = -1; while (l <= r) { int mid = l + (r - l) / 2; if ((long long)mid * mid <= x)原创 2020-06-07 09:35:21 · 163 阅读 · 0 评论 -
【set】
set<int> my_set;my_set.insert(a);my_set.erase(iter); //输入迭代器my_set.clear();my_set.empty();my_set.begin();my_set.end();my_set.size();my_set.find(a); //返回迭代器my_set.rbegin(); // my_set.rbegin() = my_set.end()-1;my_set.rend(); /原创 2020-06-05 11:29:40 · 107 阅读 · 0 评论 -
【set容器】
C++ STL 提供求交集的函数 set_intersection( ) 、求集合差的函数 set_difference( ) 和合并两个集合的函数 set_union( )。首先传递的容器必须是排序的,set 容器中元素默认是排序的,而 vector 需要调用 sort 函数进行排序。其次 set_intersection( )中最后存放交集的容器的容量必须要足够大到能放下所有的元素,即函数只执行复制,不是插入!但是模板 insert_iterator 可以将复制转换为插入,可以解决该问题。set_i原创 2020-06-05 11:23:35 · 114 阅读 · 0 评论 -
【map知识点总结】
1 map自动按照升序进行排列2 map(key,value)的value如果减为0,那么自动删除这个keym.begin()是开头,m.rbegin()是结尾,同理m.rend()是开头,如果遍历的话也是++练习题:上升下降字符串class Solution {public: string sortString(string s) { if(s.size() <= 1) return s; std::map<char, int> m; f原创 2020-06-03 20:21:07 · 181 阅读 · 0 评论 -
【leetcode】数组建树
将有序数组转换为二叉搜索树class Solution {public: TreeNode* sortedArrayToBST(vector<int>& nums) { return build(nums, 0, nums.size() - 1); } TreeNode* build(vector<int>& nums,int l,int r) { if(l > r) return NULL; .原创 2020-06-03 17:04:55 · 650 阅读 · 0 评论 -
【leetcode】遍历二叉树从跟到叶子的核心代码
从根到叶的二进制数之和 void s(TreeNode* root) { if(!root) { return; } if(!root->left && !root->right) { v.push_back(root->val); vec.push_back(v); } v.push_back(root->val); auto v2 = v;原创 2020-06-02 18:55:37 · 116 阅读 · 0 评论 -
【leetcode】利用队列实现二叉树的层序遍历
class Solution {public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> s; if(root == nullptr) return s; queue<TreeNode*> _s; _s.push(root); while(!_s.empty()) {原创 2020-06-02 16:09:25 · 125 阅读 · 0 评论 -
【树知识点汇总】
B站数据结构https://www.bilibili.com/video/BV1JW411i731?p=34原创 2020-06-01 12:02:18 · 134 阅读 · 0 评论 -
【leetcode】二叉树的深度以及树是否平衡的问题
我把这两个问题归为一类问题。因为其核心思想都是用递归去实现的。实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。判断树是否平衡的代码:class Solution {public: bool balance=true; bool isBalanced(TreeNode* root) { height(root); return balance; } int height(Tre原创 2020-06-01 11:16:22 · 168 阅读 · 0 评论 -
【leetcode】动态规划优秀题目
爬楼梯(斐波那契数列的衍生)假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?class Solution {public: int climbStairs(int n) { int res_first = 0, res = 1; for (int i = 1; i <= n ; i ++) res = res_first + res; res_first = res -.原创 2020-05-31 11:34:07 · 104 阅读 · 0 评论 -
【leetcode】山羊文
class Solution {public: string toGoatLatin(string S) { stringstream ss(S); string res; int count = 0; string word; while(ss >> word){ count++; if(word[0]=='a' || word[0]=='e' || word[0]=='i' || word[0]=='o' ||原创 2020-05-30 17:15:35 · 91 阅读 · 0 评论 -
【leetcode】心得
字符串判断字符串的长度:c.length();从字符串的头部插入字符:c.insert(c.begin(),n)查找元素:c.find(" ",从,begin())原创 2020-05-30 16:03:25 · 211 阅读 · 0 评论 -
【leetcode】557. 反转字符串中的单词 III-原地算法
class Solution {public: string reverseWords(string s) { //边界条件 int len = s.length(); if(len == 0){ return s; }; //外判断 int start = 0; int end = s.find(" "); while(end != -1){ reverse(s.begin()+st原创 2020-05-30 11:43:55 · 136 阅读 · 0 评论 -
【leetcode】数组的度-两个map关联初探
class Solution {public: unordered_map<int,vector<int>> m;//统计开始和结束坐标 unordered_map<int,int> m1;//统计度 int findShortestSubArray(vector<int>& nums) { int max=0;//统计最大频数 int min=50000;//统计最短长度 //统计所有字符开始的坐标原创 2020-05-23 14:39:17 · 133 阅读 · 0 评论 -
【leetcode】图片平滑器
class Solution {public: vector<vector<int>> imageSmoother(vector<vector<int>>& M) { int m = M.size(), n = M[0].size(); vector<vector<int>> result(m, vector<int>(n)); for (int i = 0; i <原创 2020-05-22 21:40:47 · 201 阅读 · 0 评论 -
【leetcode】杨辉三角Ⅱ
class Solution {public: vector<int> getRow(int rowIndex) { vector<int> kRows(rowIndex+1);//第K行的vector大小为 rowIndex+1 for(int i = 0; i <= rowIndex; i++)//利用前一行求后一行,第K行要循环K遍 { kRows[i] = 1; //行末尾为1 for(int j原创 2020-05-22 17:01:01 · 88 阅读 · 0 评论 -
【leetcode】复写零
class Solution {public: void duplicateZeros(vector<int>& arr) { int size = arr.size(); int offset = 0; // 第一次遍历,计算数组中0的个数 for (int i=0; i<size; i++) { if (!arr[i]) offset++; } // 第二次遍历,从后向前按偏移量移动元素原创 2020-05-22 15:27:13 · 129 阅读 · 0 评论 -
【leetcode】最大子序和-动态规划法
class Solution{public: int maxSubArray(vector<int> &nums) { int temp = nums[0]; int result = temp; for (int i = 1; i < nums.size(); i++) { emp = max(temp + nums[i], nums[i]); resul原创 2020-05-21 18:08:47 · 69 阅读 · 0 评论 -
【leetcode】在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。
利用容器进行二维数组的表示初探class Solution {public: vector<vector<int>>matrixReshape(vector<vector<int>>& nums, int r, int c) { if (nums.empty() || nums[0].empty()) return nums; int R = nums.size(); int C = nums[0].size()原创 2020-05-21 17:01:21 · 524 阅读 · 0 评论 -
【leetcode】1018. 可被 5 整除的二进制前缀
利用取余的方法防止数值越界class Solution {public: vector<bool> prefixesDivBy5(vector<int>& A) { vector<bool> answer; int sum = 0; for(int i = 0; i<A.size(); ++i) { sum = 2*(sum + A[i]); sum %= 5;原创 2020-05-21 12:49:20 · 125 阅读 · 0 评论 -
【leetcode】给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff数对。
class Solution {public: int findPairs(vector<int>& nums, int k) { unordered_map<int, int> map; int count = 0; if(k < 0)//好坑不止有-1 还有-157 return 0; if(k == 0) { //当k=0时,其实就是找数组中有没有重复元素 且重复原创 2020-05-21 10:46:01 · 2129 阅读 · 2 评论 -
【排序算法】计数排序-常规算法
#include <iostream>using namespace std;void Count_Sort(int* arr, int lens,int indexlens,int Max,int Min) { int* arr1 = new int[indexlens]; for (int i = 0; i < indexlens; ++i) arr1[i] = 0; int* arr2 = new int[lens]; for (int i = 0; i <原创 2020-05-18 20:02:50 · 93 阅读 · 0 评论 -
【排序算法】希尔排序-常规排序
#include <iostream>using namespace std;void shellSort(int R[], int n){ int i, j, d; int tmp; d = n / 2;//设置增量 while (d > 0)//出口 { for (i = d; i < n; i++)//对所有组采用直接插入排序 { tmp = R[i];//对相隔d个为止一组采用直接插入排序 j = i - d; while (j &g原创 2020-05-18 16:34:44 · 105 阅读 · 0 评论 -
【排序算法】快速排序-递归方法
#include <iostream>using namespace std;void Quick_sort(int* arr, int low, int high) { if (high <= low) return; int i = low; int j = high + 1; int key = arr[low]; while (true) { /*从左向右找比key大的值*/ while (arr[++i] < key) { if (i原创 2020-05-18 12:15:42 · 753 阅读 · 2 评论 -
【排序算法时间复杂度分析】递推式
关于包含递归调用的时间复杂度分析—以归并排序为例子T(n) = 2*T(n/2)+O(n) T(n/2) 代表一次递归 O(n)代表合并T(1) = T(1)T(n)/n = T(n/2)/(n/2) +O(1)令S(n)=T(n)/nS(1)=O(1)S(n)=S(n/2)+O(1) = S(n/4)+O(2) = S(n/8)+O(3) = S(n/s^k)+O(k)=S(1)+ o(logn)= o(logn)T(n)/n=S(n)= o(logn)T(n)=n*o(logn)原创 2020-05-17 20:03:27 · 1431 阅读 · 0 评论 -
【排序算法】归并排序-递归方法
#include<iostream>#include<ctime>#include<cstring>#include<cstdlib>using namespace std;void merge(int* data, int start, int mid, int end, int* result){ int i, j, k; i = start; j = mid + 1; //避免重复比较da原创 2020-05-17 19:43:17 · 272 阅读 · 0 评论 -
【排序算法】插入排序-常规方法
插入排序的时间复杂度最优为O(n)-当数组整体有序的时候最差时间复杂度为O(N^2)#include <iostream>#include <algorithm>using namespace std;void insert_sort(int arr[], int len){ for (int i = 1; i < len; i++) { int current = i; while (current > 0 && arr[cur原创 2020-05-11 17:35:29 · 79 阅读 · 0 评论 -
【排序算法】堆排序——常规方法
堆排序的时间复杂度是O(n*logn)#include <iostream>#include <algorithm>using namespace std;void max_heapify(int arr[], int start, int end){ //建立父节点指标和子节点指标 int dad = start; int son = dad * 2 + 1; while (son <= end) //若子节点指标在范围内才做比较 { if (so原创 2020-05-11 15:39:24 · 91 阅读 · 0 评论 -
【排序算法】选择排序
利用数组储存的元素进行选择排序的最优和最差的时间复杂度都是o(n^2),空间复杂度都是o(1).数组储存的元素进行选择排序是不稳定的 。例如10 10 7 2 8 2#include<iostream>using namespace std;void print_array(int* array, int length){ cout << "array:" << endl; for (int i = 0; i < length; i++) {原创 2020-05-10 17:36:59 · 76 阅读 · 0 评论 -
【数据结构】1、零碎知识点集合
1、数据结构是数据项之间的结构化集合,其结构性是指数据之间的相互联系和作用,也可以理解为数据项之间的某种逻辑次序。2、数组:起始地址A,物理位置连续的一段储存空间,以A作为该数组的标识。2、向量Vector(抽象数据类型)。元素访问方式,寻秩访问。秩:反应了被创建的时间顺序。...原创 2019-12-19 17:19:05 · 106 阅读 · 0 评论