数据结构与算法
以/CC++为语言基础,深入探讨和分享数据结构与算法的经典,其中包括Leetcode等各种题型
༄yi笑奈何
一个腐败糜烂的环境,永远也无法孕育出真正的文明
展开
-
【Leetcode热题100】
LeetCode热题100原创 2024-01-30 13:02:53 · 334 阅读 · 0 评论 -
【Leetcode打卡冲冲冲】
Leetcode 121原创 2023-09-02 11:15:46 · 378 阅读 · 0 评论 -
数据结构【高精度专题】
// 高精度加法// C = A + B, A >= 0, B >= 0vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; for (int i = 0; i < A.size(); i +.原创 2022-04-14 17:47:17 · 535 阅读 · 0 评论 -
数据结构【队列专题】
先进先出(First In First Out,FIFO)的线性序列,成为“队列”。队列也是一种线性表,只不过它是操作受限的线性表,只能在两端操作:一端进,一端出。进的一端成为队尾(rear),出的一端称为队头(front)。队列可以用顺序存储,也可以用链式存储。循环队列#include <iostream>using namespace std;#define Maxsize 100typedef struct SqQueue { int *base; //.原创 2022-04-13 11:13:16 · 1246 阅读 · 0 评论 -
数据结构【双指针算法】
双指针一般应用于维护两个队列,或者同一队列。常见写法如下 for (int i = 0, j = 0; i < n; i++) { while (j < i && check(i, j)) j++; //每道题的具体逻辑 }原创 2022-04-06 09:36:23 · 1434 阅读 · 1 评论 -
leetcode(字符串专题)
5. 最长回文子串思路原创 2022-02-21 13:42:40 · 8523 阅读 · 0 评论 -
leetcode(链表专题)
876. 链表的中间结点思路快慢指针算法,边界判断如果(快指针的next为空)则为奇数个,如果(快指针为空)则为偶数个。codeclass Solution {public: ListNode* middleNode(ListNode* head) { auto p1 = head, p2 = head; while (p1 && p1->next) { p2 = p2->next; p1 = p1->next->next原创 2022-02-19 19:59:48 · 564 阅读 · 0 评论 -
leetcode(动态规划专题)
53. 最大子数组和int maxSubArray(vector<int>& nums) { //res:最后所有状态的最终Max结果 //lat:当前f[i]状态的Max int res = INT_MIN, last = 0; for (int i = 0; i < nums.size(); i++) { //当前f[i]状态最大值(使用下面的状态转移方程得出) int now = max(last, 0) + nums[i]; /* 最终是所有原创 2022-02-19 08:31:07 · 470 阅读 · 0 评论 -
0xFFFFFF的问题
这个有两个结果:16777215和-1如果是单纯的16 进制数,那么转换为10 进制数为16777215。相信这个转换结果很好理解:15*16^0+15*16^1+...+15*16^5。j即(int型所能表示的最大值)第二种情况就是 0xFFFFFF 如果是在计算机中的存储形式,那么结果就是-1。...原创 2022-02-11 11:26:40 · 757 阅读 · 0 评论 -
从前有座山,山里有座庙:递归之法
递归描述递归调用是函数内部调用自身的过程,递归必须要有结束条件,否则会进入无限递归状态。无法停止。 我们称这个条件为(递归基)递归原理递归包括(递推)和(回归),递推是指将原问题不断分解为子问题,直到达到结束条件,返回最近子问题的解;然后逆向逐一回归,最终到达递推开始的原问题,返回原问题的解。要素提取:原问题是否可以分解为层级的子问题。 每个子问题的求解方式是否与原问题处理方式相似。 整个框架是否存在明确的递归基,即结束条件。递归案例:阶乘int factorial(原创 2022-02-10 11:01:35 · 750 阅读 · 0 评论 -
DFS深搜与BFS广搜专题
一般搜索算法的流程框架DFS和BFS与一般搜索流程的关系如果一般搜索算法流程4使用的是stack栈结构(先进后出,后进先出)那么就会越搜越深。即,DFS。反之,如果流程4使用的是queue队列结构(先进先出)那么就会先处理相邻的,然后再进入下一层,即,BFS递归DFS的流程框架用栈的DFS和用递归的DFS区别...原创 2022-02-08 10:54:47 · 362 阅读 · 1 评论 -
【前缀和与差分】
前缀和的作用:快速计算数组中某一段区间内的总和1.需要两个额外的数组,来存储原始数据的数组 和 计算过前缀的数组。2.首先需要对前缀和数组s进行初始化,从1开始进行初始化。3.计算原数组中L到R某一段区间 可以直接使用s[R] - s[L- 1]。#include <iostream>using namespace std;const int N = 100010;int n, m;int a[N], s[N];int main(){ scanf..原创 2021-12-09 11:36:50 · 479 阅读 · 0 评论 -
Leetcode 14.最长公共前缀
原题链接解题思路:1.本题使用模拟法2.取第一个字符串的首元素,与剩余字符串对应位置相比较,如果全部相等将此字符加入结果中,继续到下一个字符一次比较,直至出现不相同的位置,返回结果。3.需要注意每个字符串是否为空的边界情况。class Solution {public: string longestCommonPrefix(vector<string>& strs) { string res; if (strs.empty()) retur原创 2021-11-23 09:48:45 · 86 阅读 · 0 评论 -
leetcode(二分查找算法专题)
二分模板一共有两个,分别适用于不同情况。算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。版本1当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。C++ 代码模板:int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >........原创 2021-11-03 11:27:34 · 449 阅读 · 2 评论 -
数据结构【单调栈】
单调栈 常见模型:找出每个数左边离它最近的比它大/小的数int tt = 0;for (int i = 1; i <= n; i ++ ){ while (tt && check(q[tt], i)) tt -- ; stk[ ++ tt] = i;}原创 2021-11-02 11:33:09 · 154 阅读 · 0 评论 -
各种排序算法思想
快速排序主要思想: 主要是基于分治。(分治解读)基本步骤:1.确定分界点x ,常用方式q[l] q[l + r >> 1] , q[r] , 左右部分未必长度相等2.根据分界点x调整区间,使得满足小于等于x的在左边,大于等于x的在右边3.左右两端,递归缩小规模处理,然后进行拼接,即两个区间合并// 快速排序算法模板void quick_sort(int q[], int l, int r){ if (l >= r) return; .原创 2021-10-21 10:19:02 · 376 阅读 · 2 评论 -
LeetCode 92. 反转链表 II
原题链接解题思路/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : .原创 2021-09-02 10:39:36 · 756 阅读 · 0 评论 -
二叉树专题
(一)二叉树的三种遍历方式:本质是在递归序的基础上打印时机的不同。前序遍历: 1 2 4 5 3 6 7 ; 中序遍历 : 4 2 5 1 6 3 7 ; 后序遍历 : 4 5 2 6 7 3 1 ;(二)各种遍历的非递归实现struct Node { int value; Node *left; Node *right;};前序遍历:1.先定义一个栈,把跟压入栈 ; 2. 弹出栈顶元素,并且打印出来;3.如果弹出的栈顶元素有右节点,先将...原创 2021-01-07 11:49:19 · 173 阅读 · 0 评论 -
常见算法核心思想
双指针算法1.双指针算法主要是为了提高朴素算法的复杂度,即O(n^2)的算法,优化为O(n)的算法。2.常见模板for (int i = 0, j = 0; i < n; i ++ ){ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作相关题目...原创 2020-11-28 20:54:04 · 297 阅读 · 0 评论 -
剑指 Offer 01-----20
剑指 Offer 03. 数组中重复的数字解题思路,使用STL中的set,逐个读入vector中的每一个元素,使用set进行对比,如果set中存在会返回1,这时直接返回该元素即可;如果set中没有可以insert这个元素到set,进行下一次遍历。class Solution {public: int findRepeatNumber(vector<int>& nums) { set<int> ret; for(auto i:原创 2020-11-28 15:32:37 · 145 阅读 · 0 评论 -
剑指 Offer 51-----59
剑指 Offer 55 - I. 二叉树的深度解题思路:class Solution {public: int maxDepth(TreeNode* root) { if(root==NULL)return 0; int l=maxDepth(root->left); int r=maxDepth(root->right); return (l>r?l:r)+1; }};...原创 2020-11-28 15:21:47 · 152 阅读 · 0 评论 -
剑指 Offer 40-----50
原题链接class Solution {public: char firstUniqChar(string s) { char res = ' '; if(!s.size()) return res; unordered_map<char, int> mmp; for(int i = 0; i < s.size(); i++) { mmp[s[i]] += 1; }原创 2020-11-28 13:52:54 · 105 阅读 · 0 评论 -
Leetcode 28. 实现 strStr()
原题链接解:KMP算法class Solution {public: int strStr(string s, string p) { if (p.empty()) return 0; int n = s.size(), m = p.size(); s = ' ' + s, p = ' ' + p; vector<int> next(m + 1); for (int i = 2, j = 0;原创 2020-11-28 14:51:20 · 114 阅读 · 0 评论 -
Leetcode 24. 两两交换链表中的节点
原题链接题解:class Solution {public: ListNode* swapPairs(ListNode* head) { auto dummy = new ListNode(-1); dummy->next = head; for (auto p = dummy; p->next && p->next->next;) { auto a = p->next,原创 2020-11-28 14:51:28 · 183 阅读 · 0 评论 -
Leetcode 61. 旋转链表
原题链接题解:class Solution {public: ListNode* rotateRight(ListNode* head, int k) { if (!head) return head; int n = 0; ListNode* tail; for (auto p = head; p; p = p->next) { tail = p; n ++ ;原创 2020-11-25 23:31:12 · 130 阅读 · 0 评论 -
Leetcode 151. 翻转字符串里的单词
原题链接class Solution {public: string reverseWords(string s) { int k = 0; for (int i = 0; i < s.size(); i ++ ) { if (s[i] == ' ') continue; int j = i, t = k; while (j < s.size() && s[j]原创 2020-11-23 10:49:07 · 165 阅读 · 0 评论 -
LeetCode 13. 罗马数字转整数
原题链接class Solution {public: int romanToInt(string s) { int tagVal[128]; tagVal['I'] = 1; tagVal['V'] = 5; tagVal['X'] = 10; tagVal['L'] = 50; tagVal['C'] = 100; tagVal['D'] = 500; tagV原创 2020-11-22 20:54:49 · 106 阅读 · 0 评论 -
LeetCode 09. 回文数
原题链接class Solution {public: bool isPalindrome(int x) { if(x<0) return false; if(x>=0 && x<10) return true; long long temp = 0; int xx = x; while(x!=0){原创 2020-11-28 14:51:38 · 138 阅读 · 0 评论 -
Leecode 136. 只出现一次的数字
原题链接解法:异或运算 A^A=0 A^0=Aclass Solution {public: int singleNumber(vector<int>& nums) { int ret = 0; for(auto p : nums) ret^=p; return ret; }};原创 2020-11-22 20:24:46 · 225 阅读 · 0 评论 -
LeetCode 03. 无重复字符的最长子串
原题链接解题思路:class Solution {public: int lengthOfLongestSubstring(string s) { unordered_map<char, int> hash; int res = 0; for (int i = 0, j = 0; j < s.size(); j ++ ) { hash[s[j]] ++ ; w原创 2020-11-28 14:51:42 · 154 阅读 · 0 评论 -
LeetCode 203. 移除链表元素
原题链接class Solution {public: ListNode* removeElements(ListNode* head, int val) { auto dummy = new ListNode(-1); dummy->next = head; for (auto p = dummy; p; p = p->next) { auto q = p->next; while原创 2020-11-21 22:49:03 · 104 阅读 · 0 评论 -
LeetCode 02.两数相加
原题链接解题思路:本题可以使用模拟法,从链表的结点中提取出value逐个相加进位。从而得到最后的结果链表/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {}原创 2020-11-28 14:51:59 · 1394 阅读 · 0 评论 -
LeetCode 225. 用队列实现栈
算法(队列,栈) O(n)我们用一个队列来存储栈中元素。对于栈中的四种操作:push(x) – 直接入队;pop() – 即需要弹出队尾元素。我们先将队首元素弹出并插入队尾,循环 n−1次,n是队列长度。此时队尾元素已经在队首了,直接将其弹出即可;top() – 即返回队尾元素。同理,我们先将队首元素弹出并插入队尾,循环 n−1次,n是队列长度。此时队尾元素已经在队首了,直接将其返回。不要忘记将其弹出并插入队尾,恢复队列原状;empty() – 返回队列是否为空;时间复杂度分析:p原创 2020-10-10 10:21:18 · 245 阅读 · 0 评论 -
【斐波拉切数列第N项】
#include<iostream>using namespace std;int main(){ int f[100]; f[0] = 0, f[1] = 1; int n; cin >> n; for (int i = 2; i <= n; i++) { f[i] = f[i - 1] + f[i - 2]; } cout <<f[n] << endl; return 0;}原创 2020-09-28 10:05:24 · 98 阅读 · 0 评论 -
Leetcode 08. 字符串转换整数 (atoi)
原题链接1.字符 0~~~~~9 分别对应整数 48~~~~~572.先过滤空白3.确定前面所带的符号4. long long res = 0; res = res * 10 + str[k] - '0'; 可以通过此方法从左到右高位逐个累加。class Solution {public: int myAtoi(string str) { long long res = 0; int k = 0; while(k &...原创 2020-11-28 14:52:03 · 219 阅读 · 0 评论 -
LeetCode 20.有效括号
原题链接解题思路,使用栈 + 模拟法class Solution {public: bool isValid(string s) { stack<char> tempStack; for(char& c: s){ switch(c){ case '(': ...原创 2020-03-31 09:40:56 · 202 阅读 · 0 评论 -
LeetCode 231. 2的幂
原题链接class Solution {public: bool isPowerOfTwo(int n) { if(n<=0) return false; if((n&n-1) == 0) return true; return false; }};原创 2020-03-31 09:35:35 · 118 阅读 · 0 评论 -
LeetCode 1047. 删除字符串中的所有相邻重复项
原题链接解题思路:我们可以用栈来维护没有重复项的字母序列: 若当前的字母和栈顶的字母相同,则弹出栈顶的字母; 若当前的字母和栈顶的字母不同,则放入当前的字母。 class Solution {public: string removeDuplicates(string S) { string res = ""; for (au...原创 2020-03-31 08:59:19 · 185 阅读 · 0 评论 -
LeetCode 933.最近的请求次数
原题链接class RecentCounter {public: RecentCounter() { } int ping(int t) { time.push(t); while(time.front()<t-3000){ time.pop(); } retu...原创 2020-03-31 08:49:29 · 176 阅读 · 0 评论 -
LeetCode 1021 删除最外层的括号
原题链接class Solution {public: string removeOuterParentheses(string S) { string str; int flag = 0; for(char c: S){ if(c=='(' && flag++>0){ ...原创 2020-03-31 08:24:24 · 117 阅读 · 0 评论