自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 资源 (2)
  • 收藏
  • 关注

原创 最近最久未被使用(LRU)缓存机制(哈希链表)

LRU 缓存算法的核心数据结构就是哈希链表,双向链表和哈希表的结合体。这个数据结构长这样:其实很简单:哈希表(unordered_map)中的二元组为unordered_map<int, list<pair<int, int>>::iterator>;双向链表(list)中的二元组为list<pair<int, int>>。分析上面的操作过程,要让 put 和 get 方法的时间复杂度为O(1),我们可以总结出 cache 这个数据结构必要.

2020-05-25 16:25:11 315

原创 二叉树中的最大路径和(DFS)

这道题又是相当漂亮的递归。我的思路:DFS+后序遍历如图所示,题目所说的二叉树中的路径可以分为以下四种:case1:单一结点case2:某个结点及其左子树组成路径case3:某个结点及其右子树组成路径case4:某个结点及其左右子树组成的路径要注意其中类型4的路径是无法作为子路径返回给上一级结点的(原因我画了个图)显然,上面这种路径出现了分叉,不合题意。所以,case1,case2,case3的子递归结果可以传给上一级递归,case4的子递归结果不可以传给上一级递归。但是更新max_.

2020-05-31 18:01:55 1310

原创 排序链表(归并排序)

看到复杂度就知道要用归并。这题正好拿来练手,归并很简单,但还是要多写。class Solution {public: ListNode* sortList(ListNode* head) { if (head == NULL || head->next == NULL) return head; //接下来快慢指针寻找链表中点,分为两段 ListNode*fast = head, *slow = head; ListNode*slow_prev = NULL; wh.

2020-05-30 15:36:46 170

原创 反转字符串中的单词(简单题)&替换空格(双指针)

这种题太简单了。class Solution {public: string reverseWords(string s) { //简单小题(剑指offer有类似的题) if(s.size()==0) return ""; s+=' ';//尾部加一个空格 int mark=0; //根据空格,反转每一个单词 for(int i=0;i<s.size();i++) .

2020-05-30 12:01:37 185

原创 有效的括号(辅助栈)

class Solution {public: bool isValid(string s) { unordered_map<char, int> mp{ { '(',1 },{ '[',2 },{ '{',3 },{ ')',-1 },{ ']',-2 },{ '}',-3 } }; stack<char>my_stack; for (char c : s) { if (!my_stack.empty() && mp[my_stack.t.

2020-05-29 22:27:51 160

原创 合并两个有序数组(很有趣的三个指针)

首先,这种把nums2中的元素先放入nums1,再进行排序的方法就不要提了,太low了。我的思路是三个指针,从后往前:时间复杂度为O(m+n)显然,如果出现len2先为-1的情况,那么是最好的,直接结束;如果出现len1先为-1的情况,那么要对num1进行补全!class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { .

2020-05-29 15:47:30 532

原创 无重复字符的最长子串(滑动窗口+双指针)

class Solution {public://滑动窗口法+双指针 int lengthOfLongestSubstring(string s) { if (s.size() == 0) return 0; int left = 0,right=0; int maxlength = 1; //关键就是时刻要保证双指针区间内的字符串是无重复字符的 //start right++; //每次while循坏都会加入一个新的s[right] w.

2020-05-28 14:41:47 275

原创 复习——unique_ptr、auto_ptr、shared_ptr、weak_ptr的核心代码

auto_ptr先用一道题说明auto_ptr的不足:问题:为什么vector中的元素不可以是auto_ptr的对象?原因很简单,vector是将对象拷贝一份,然后放入,而对auto_ptr进行拷贝后,所有权被转交出去,不再属于原来的auto_ptr了,所以不符合vector的要求。shared_ptr一句话介绍shared_ptr智能指针:多个shared_ptr中的T *ptr可以指向同一个内存区域(同一个对象),并共同维护同一个引用计数器。一般来说,智能指针的实现需要以下步骤:1.一个模

2020-05-27 23:07:03 516

原创 复习——BitMap位图

使用位图进行排序的时间复杂度是O(n),是典型的以空间换时间。1.1位图排序#define BYTESIZE 8void SetBit(char*p, int pos){ for (int i = 0; i < (pos / BYTESIZE); i++) { p++; } *p |= 0x01 << (pos%BYTESIZE);}void BitMapDemo(){ int num[] = { 3,5,2,10,6,12,8,14,9 }; //因为待排序

2020-05-27 15:34:24 202

原创 最长公共前缀(简单题)

其实这道题我最初是想用前缀树来做的,trie树的第一个分叉口之前的单分支树的就是所求。后来一想其实可以简单点,先找出所有字符串中最短的,然后进行查找即可。class Solution {public: //水平扫描法 string longestCommonPrefix(vector<string>& strs) { if (strs.size() == 0)return ""; //1.先求出数组中最短的字符串及其长度 int min_len = INT_MAX.

2020-05-25 10:23:54 161

原创 寻找两个正序数组的第K大元素(思路很难想到)

这道题让我们求两个有序数组的中位数,而且限制了时间复杂度为O(log (m+n)),看到这个时间复杂度,自然而然的想到了应该使用二分查找法来求解。为了简化代码,不分情况讨论,我们使用一个小trick,我们分别找第 (m+n+1) / 2 个,和 (m+n+2) / 2 个,然后求其平均值即可,这对奇偶数均适用。加入 m+n 为奇数的话,那么其实 (m+n+1) / 2 和 (m+n+2) / 2 的值相等,相当于两个相同的数字相加再除以2,还是其本身。这里我们需要定义一个函数来在两个有序数组中找到第K个.

2020-05-24 22:24:52 713

原创 后缀树的实现

第一次遇到后缀树这种数据结构,所以就去理解了一下,感觉原理不难懂,但是相比于前缀树,后缀树的代码实现还是有点麻烦。后缀树常用于在母串s中查询子串p是否存在,并查询子串在母串中开始的位置给一个例子://后缀树的实现class SuffixTreeNode{private: map<char, SuffixTreeNode*>children;//记录当前结点的子结点信息 vector<int>indexes;//记录子串在父串中的起始位置public: void

2020-05-24 10:31:27 564

原创 复习——Top K问题

首先,像这种先把数组排序后再找出k个数的暴力方法就不要提了,太low了。法1:很容易想到,也很简单,直接使用快排中的partition函数即可;法2:当面对海量数据时,就不能使用快排了,但依然可以使用堆;法3:Bit-map法1:快排class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { int n = arr.size(); if (n == k).

2020-05-21 11:36:09 249

原创 复习——6种常用的排序

插入排序插入排序的基本思想就是每次将待插入元素按索引大小插入到前面已经排好序的子序列中。void InsertSort(int *a, int n)//升序{ for (int i = 1; i < n; i++) { int temp = a[i]; int j = i - 1; //从i-1开始从后往前查找待插入的位置 while (j >= 0 && temp < a[j])//找到前面第一个比temp小的元素的位置 { //向后挪

2020-05-20 16:49:06 174

原创 复习——哈夫曼树及哈夫曼编码

1.哈夫曼树的构造给定N个权值为{w1,w2,w3,…,wN}的结点(比如可以根据一个字符串中字母出现的频率计算权值)。构造哈夫曼树的算法流程如下:1.将这N个结点分别作为N棵仅含一个结点的二叉树,构成森林F;2.构造一个新结点,并从F中选取两棵根结点权值最小的树作为新结点的左、右子树(左边的权<右边的权),并将新结点的权值置为左、右子树上根结点的权值之和;3.从F中删除刚才选取的两棵树,同时将新生成的树放入F;4.重复步骤2和3,直到F中只剩下一棵树为止。2.哈夫曼编码首先先了解前缀编

2020-05-19 16:43:28 1044

原创 200519题(简单双指针题)

class Solution {public: //从左右两端开始验证是否是回文串,验证的过程中,只有一次机会删除 bool validPalindrome(string s) { int i = 0, j = s.size() - 1; while (i <= j) { if (s[i] != s[j])//使用唯一的一次机会删除 return isValid(s, i + 1, j) || isValid(s, i, j - 1); i++; j--;.

2020-05-19 15:22:55 144

原创 乘积最大子数组、最大子序和

这道题如果限定数组元素全是非负数,那么就很简单了:但是这题数组元素可以是负数,这就比较难想到了,参考别人的思路:class Solution {public: int maxProduct(vector<int>& nums) { int res = INT_MIN; int imax = 1, imin = 1; for (int i = 0; i < nums.size(); i++) { if (nums[i] < 0) swa.

2020-05-18 10:56:32 415

原创 朋友圈(带路径压缩的并查集算法)

所谓路径压缩,原理如下图:这一题的思路就很清楚了,很快写出代码如下:class Solution {public: int findCircleNum(vector<vector<int>>& M) { int count = 0; //先初始化每个单结点(每个单结点的根就是他们本身) int*set = new int[M.size()]; for (int i = 0; i < M.size(); i++) { set[i] .

2020-05-18 09:44:46 299

原创 课程表Ⅱ(使用BFS完成拓扑排序)

我的思路:class Solution {private: vector<vector<int>>edges;//存储有向图 vector<int>inedge;//存储每个结点的入度 vector<int>res;//存储答案public: vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) { ..

2020-05-17 15:49:18 183

原创 是否为平衡二叉树(自顶向下、自底向上)

法1:暴力法(自顶向下)这种方法最容易想到,但是每一个结点都会被遍历多次,时间复杂度太高!class Solution {public: bool isBalanced(TreeNode* root) { if (root == NULL) return true; int diff = abs(depth(root->left) - depth(root->right)); //当前结点的左右子树的高度差 if(diff>1) return false; .

2020-05-16 22:40:08 317

原创 验证二叉搜索树(DFS)

思路很好想到,利用中序遍历进行检验,那么只需要用一个pre来记录当前结点的前一个结点的val即可。class Solution {private: long pre = LONG_MIN;public: bool isValidBST(TreeNode* root) { if (!root) return true; if (!isValidBST(root->left))//左子树已经完成判断 return false; if (root->val <.

2020-05-16 21:45:47 245

原创 路径总和Ⅲ(双递归)

这题是我遇到的第一个双递归的题目,这题和路径总和ⅠⅡ(回溯法)的唯一不同在于它没有限定路径的起点(不一定要求是根结点),也没有限定路径的终点(不一定要求是叶子结点)。所以就要用到双递归了。我的代码如下://双递归class Solution {public: int pathSum(TreeNode* root, int sum) { if (root == NULL) return 0; DFS_2(root, sum); return res; } void DFS_.

2020-05-16 17:48:06 267

原创 栈排序(辅助栈)

这个题脑子里想想就明白了。class SortedStack {public: stack<int>s1, s2;//s1是辅助栈 SortedStack() { } void push(int val) { if (s2.empty()) { s2.push(val); return; } while (!s2.empty()) { if (val <= s2.top()) { break; } s.

2020-05-16 10:15:57 488

原创 只出现过一次的数字ⅠⅡⅢ(简单的位运算)

class Solution {public: int singleNumber(vector<int>& nums) { //典型的异或运算 int res = 0; for (int i : nums) { res ^= i; } return res; }};class Solution {public: vector<int> singleNumber(vector<int>& nums) { .

2020-05-14 15:23:28 237

原创 二叉树的层序(以及锯齿状)遍历(BFS)

//BFSclass Solution {public: vector<vector<int>> levelOrder(TreeNode* root) { if (root == NULL)return{}; queue<TreeNode*>myqueue; myqueue.push(root); vector<vector<int>>res; while (!myqueue.empty()) { int le.

2020-05-13 12:46:38 193

原创 复习——dynamic_cast(RTTI)

例子1直接看代码:代码1:class Base {public: Base() :b(1) {} virtual void foo() {} int b;};class Derived :public Base{public: Derived() :d(2), Base() {} int d;};void fun(Base*pb){ Derived*pd1 = static_cast<Derived*>(pb);//把基类对象指针下行转换为派生类对象指针

2020-05-12 21:18:55 233

原创 复习——虚函数表的实现&typeid

class Base {public: virtual void f() { cout << "Base::f" << endl; } virtual int g() { cout << "Base::g" << endl; return 0; } virtual int h(int a) { cout << "Base::h" << endl; return 0; }};int main(){ typedef vo

2020-05-12 14:41:04 471

原创 Pow(x,n)(快速幂乘算法)

关键点是快速幂乘算法(在奶牛家族那道题中也用到了矩阵的快速幂乘算法)class Solution {public: double myPow(double x, int n) { if (x == 0)return -1; if (n == 0)return 1; if (n < 0) x = 1. / x; bool flag = 1;//1表示结果为正,0表示结果为负 if (x < 0) { x = -x; if (n % 2 != 0).

2020-05-11 10:38:40 571

原创 x的平方根(简单的二分)

class Solution {public: int mySqrt(int x) { //二分 int low = 0, high = x, ans = -1; while (low <= high) { long long mid = low + (high - low) / 2; if (mid*mid == x)return mid; else if (mid*mid < x) { low = mid + 1; ans = m.

2020-05-10 22:46:24 199

原创 二叉树的最近公共祖先(DFS)

这题是非常好的递归题!!class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (root == NULL)return NULL;//递归结束的条件 if (root == p || root == q)//递归结束的条件 return root; TreeNode*left = lowestCommonAncestor(root.

2020-05-10 22:28:14 252

原创 最低票价(dp)

const int max_value = 65536;class Solution {public: int mincostTickets(vector<int>& days, vector<int>& costs) { //dp[i]表示到第i天为止花费的最少路费 int len = days.size();//需要出行的天数 i...

2020-05-06 21:15:24 205

原创 快慢指针(4个链表题)

class Solution {public: ListNode* middleNode(ListNode* head) { //快慢指针 ListNode*fast = head; ListNode*slow = head; while (fast != NULL&&fast->next != NULL) { fast = fast->...

2020-05-05 20:28:15 220

原创 二叉搜索树中的众数

思路1:最容易想到的思路就是先中序遍历BST,得到的序列放到一个数组v中,然后查找v中的众数即可。class Solution {public: vector<int> findMode(TreeNode* root) { vector<int>res; vector<int>v; if (root == NULL)return res;...

2020-05-05 17:00:26 306

原创 STL源码分析——iterator_traits(模板的泛化、特化、偏特化)

iterator_traits可以理解为一问一答的一个萃取机。template <class _Iterator>struct iterator_traits{ typedef typename _Iterator::iterator_category iterator_category; typedef typename _Iterator::val...

2020-05-05 10:57:38 454

原创 简单实现一下string类

自己简单实现一下String类,代码如下://自己简单实现一下String类#pragma warning( disable : 4996)class MyString{private: char*_data; size_t _len; void _init_data(const char*s) { _data = new char[_len + 1]; memcpy(_...

2020-05-04 21:15:23 480

原创 STL源码分析——type_traits

type_traitstype_traits是C++11提供的模板元基础库。type_traits可实现在编译期计算、判断、转换、查询等等功能。type_traits提供了编译期的true和false。// type_traits中源码//is_const的实现//以下为了和实际源代码区分,全部加了mytemplate<typename _Tp>struct my_is...

2020-05-03 22:59:01 279

原创 STL源码分析——字符特性类模板char_traits

字符特性模板,目的是提供最基本的字符特性的统一的方法函数。char_traits继承了__char_traits_base// Class __char_traits_base.// 字符特性基类模板template <class _CharT, class _IntT> class __char_traits_base {public: typedef _Char...

2020-05-03 16:05:14 630

原创 STL源码分析——一个万用的Hash Function

class Customer{public: string fname; string lname; long no; Customer(const string _fname, const string _lname, long _no) :fname(_fname), lname(_lname), no(_no) {}//constructor};template<...

2020-05-02 22:01:27 338 1

原创 STL源码分析——istream_iterator(本质上是一个iterator adapter)

template<class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t>class my_istream_iterator :public iterator<input_iterator_tag, T, Distance, const T...

2020-05-02 10:28:43 405 1

原创 STL源码分析——ostream_iterator(本质上是一个iterator adapter)

由于ostream_iterator的类模板比较简单,就不需要适配器辅助函数创建其对象,可以直接指定模板参数创建对象。template<class InputIterator, class OutputIterator>//函数模板OutputIteratormy_copy(InputIterator first, InputIterator last, OutputItera...

2020-05-01 22:29:02 335

java基础 综合项目代码

java基础 综合项目

2020-12-21

epoll反应堆.zip

epoll反应堆.zip

2020-06-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除