计算机四大力柱
实战
妖怪喜欢风
追风
展开
-
支持区间修改的数据结构:线段树
区间求和的方法可以使用前缀和或者前缀和差分,但是并不支持修改,因此可以使用第二种方法,线段树。时间复杂度建树:O(nlogn)查询:O(logn)区间修改:O(logn)#include <stdio.h>#include <stdlib.h>/* 线段树节点* l:节点左区间* r:节点右区间* cnt:节点的长度* sum:区间和* lazy:懒标记*/struct node { int l, r, cnt; long long su原创 2021-10-18 18:53:12 · 200 阅读 · 0 评论 -
OJ刷题:#150 矩阵旋转
题目:给出一个 n∗m 的整数矩阵,将这个矩阵顺时针旋转 90o 后输出#include <iostream>#include <vector>int main() { std::vector<std::vector<int>> matrix; int n, m, x; std::cin >> n >> m; for (int i = 0; i < n; ++i) { std:原创 2021-06-01 08:11:24 · 318 阅读 · 0 评论 -
leetcode(26): 删除有序数组中的重复项
题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。本来想用一个unordered_map来完成的,空间复杂度不给,那我用时间复杂度int removeDuplicates(vector<int>& nums) { return unique(nums.begin(), nums.end()) - nums.be原创 2021-07-04 21:29:51 · 143 阅读 · 0 评论 -
汉诺塔问题递归详解
哈诺塔问题是递归问题的一个入门问题。看了一晚上的视频,总算有点眉头啦,我根据自己的理解来梳理一下。既然是递归问题,那么可以进行归一,无论有多少个,都可以转化成一个。假设此时有三个tower a,tower b,tower c,要把tower a上的所有圆环移动到tower c,归一中,假设圆环有1个,则步骤是cout << a << "移动到" << c << endl;一个应该是作为我们递归出的出口,按照一般规律,最好再构造一个两个圆环的Hano原创 2021-06-14 00:56:08 · 5156 阅读 · 0 评论 -
经典算法:杨辉三角
这算然是个等边三角形,但是我们可以想像成为一个直角三角形,如下:11 11 2 11 3 3 11 4 6 4 1不难发现,除了第一列和diagonal,其实每个数字都是上一行的上面一个与前面一个数字的和。也就是ans[i-1][j-1]+ans[i-1][j]所以我们可以利用这个关系来写出代码。ans[i-1]为上面一行,这个比较好理解。我们初始化temp的值为1,这样diagonal和第一列都有了初始化值我们只需要以以上的关系去将中间的部分设值就好了class Solution原创 2021-03-27 12:59:39 · 1237 阅读 · 0 评论 -
递归之全排列问题
假定一个序列[1,2,3]其全排列是[1,2,3][1,3,2][2,1,3][2,3,1][3,1,2][3,2,1]可知其全排列的大致过程是第一个数加上后面数的全排列,这明显是一个递归的过程!/************************************************************************* > File Name: permutation.cpp > Author: > Mail: > Create原创 2021-06-14 01:31:37 · 168 阅读 · 0 评论 -
OJ刷题:#205 队列行平均数
题目: 海贼理工学院的老师让同学们排成了一个 n∗m 的长方形队列,老师想知道现在每行同学的 身高平均数是多少,你可以帮他求一下吗。 现已知所有同学的身高,数值为整数,单位:厘米。要求输出每一行同学们身高的平均数。code#include <iostream>#include <cstdio>#include <vector>int main() { std::vector<std::vector<double>> matri原创 2021-06-01 08:33:44 · 531 阅读 · 0 评论 -
OJ刷题:#166&167 字符串操作1、字符串操作2
题目:从键盘输入任意的一个字符串A ,其长度L 不小于6 ,同时再输入一个整数N (其中:N<L)作为插入点,以及任意的一个字符串B ,其长度为L1 (其中:L1<L ),现要求完成下列功能:如果字符串A 的长度L 大于100 输出 100 ,否则输出L ;在N 点处,插入字符串B 后,将得到一个新字符串C ,请计算并输出最后的字符串;查找字符串C 中,从右到左第一个出现字母 x 的位置。第一次的相反是将他要插入的位置进行后移要插入的个数,但是发现string str = "Hell原创 2021-06-03 19:44:42 · 738 阅读 · 2 评论 -
数据结构:线性表
线性表的定义:除了第一个结点和和最后一个结点,其他所有结点都有一个前驱结点和后继结点线性表的分类:顺序表(顺序存储)和链表(链式存储)顺序表顺序存储和C中先天的数组差不多,在此不做叙述优点支持随机存取,存取密度高大片连续空间分配不方便,改变容量不方便(定容)特点:需要预留大片连续空间,若分配空间过小,则只会不方便扩展容量;若分配空间过大,则浪费内存资源基本操作:数组这个东西,易,不做过多概述链表优点离散的小空间分配方便,改变容量方便不可随机存取,存储密度高特点:只原创 2021-04-07 19:57:53 · 105 阅读 · 0 评论 -
LeetCode 25:K个一组翻转链表
目录题目思路c++代码题目给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例1输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]示例2输入:head = [1,2,3,4,5], k = 3输出:[3,2,1,4,5]示例3输入:head = [1,2,3,4,5], k = 1输出:[1,2,3,4,5]示例原创 2021-11-21 16:40:07 · 785 阅读 · 0 评论 -
数据结构(C++):树和二叉树
树无疑是数据结构中占着举足轻重的地位,因此需要细嚼慢咽。比如满二叉树,完全二叉树,线索二叉树,遍历二叉树,AVL树(平衡二叉树),BST树(二叉排序树),B树,B+树,赫夫曼树,堆排序,树形选择排序以及有关图的知识!鉴于二叉树的应用型,对于树只做知识梳理:树的结点:一个数据元素及若干指向其子树的分支结点的度:结点拥有的子树数叶子或终端结点:度为0的结点分支结点或非终端结点:度不为0的结点树的度:树内各结点的度的最大值孩子和双亲:结点的子树的根称为该结点的孩子,该结点的原创 2021-02-22 19:55:18 · 402 阅读 · 0 评论 -
牛顿迭代法详解
https://blog.csdn.net/ccnt_2012/article/details/81837154原创 2021-04-25 12:52:31 · 633 阅读 · 0 评论 -
标记数组,减少递归重复次数
leetcode 爬楼梯题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。有三种解决方法(本菜鸡还没想出来第四种)递归:既耗时间,又耗空间class Solution {public: unordered_map<int, int> m; int floor(int n) { if (n <= 2) return n;原创 2021-07-03 01:42:26 · 245 阅读 · 0 评论 -
比较连续输入字符串的大小
相关知识点:字母序、冒泡排序、string.h头文件#include <stdio.h>#include <string.h>int main() { // 新建二维数组存放字符串 char name[10][20]; for (int i = 0; i < 10; i++) { scanf("%s", &name[i]); } // 冒泡排序 for (int i = 0; i < 10; i++)原创 2021-05-07 11:49:18 · 202 阅读 · 0 评论 -
滑动窗口算法:以leetcode634为例
子数组最大平均数 I给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。示例输入:[1,12,-5,-6,50,3], k = 4输出:12.75解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75其中的思想就是取这个数组中的某串子数组,取其最大平均数。一般是依次遍历,或许可以用双指针、动态规划等等方法,但是其复杂度是有些高的,因此,可以考虑一下滑动窗口算法此处窗口固定为k,因此我们必须保持窗口的大小为k,在滑动的时候,我们可以退出第一.原创 2021-07-01 13:32:30 · 152 阅读 · 0 评论 -
OJ刷题:#196 爬楼梯
正常可能会这么思考:我从第一节楼梯开始爬能有多少不能的爬法,这样会陷入无尽的循环,走入迷途。所以我们应该换一种思路,我们从终点开始,那么是怎么到达终点的呢?假设一次能爬1阶或2阶,那么到达终点的时候就有两种爬法,那在第4阶或者第3阶是怎么爬的呢?进行递归调用f(n) = f(n-1) + f(n-2)斐波那契函数!接下来来看一下OJ题目吧题目:这一节我们需要讨论的是一个递推的问题。在海贼理工学院有一个路飞君,他在爬楼梯的时候从来都是要么上 2 个台阶,要么上 3 个台阶。由于爬楼梯实在太原创 2021-05-24 18:24:00 · 687 阅读 · 0 评论 -
LeetCode 105.从前序和中序遍历序列构建二叉树
目录1.题目2.思路3.c++代码1.题目给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点示例1Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]示例2Input: preorder = [-1], inorder = [-1]Output: [-1]2.思路知识回顾:前序遍历规律:中左右;中序遍历规律:左中右该原创 2021-10-15 20:03:29 · 143 阅读 · 0 评论 -
leetcode:448(动态规划)、455(贪心+双指针)、463(方向数组)
448找出数组缺失元素—动态规划:循环遍历,已经被索引的值不变,没有索引的标为负数class Solution {public: vector<int> findDisappearedNumbers(vector<int>& nums) { vector<int> ans; for (int i = 0; i < nums.size(); i++) { int t = nums[i] >原创 2021-07-19 20:47:02 · 154 阅读 · 0 评论 -
数据结构:顺序表的操作
线性表,线性结构,以顺序方式存储#include <stdio.h>#include <stdlib.h>#define ERROR 0#define OK 1typedef struct Vector { int size, length; int* data; // 创建动态数组} Vector;void init(Vector* vector, int size) { vector->size = siz原创 2021-04-26 09:05:16 · 94 阅读 · 0 评论 -
算法之查找
数据结构之查找静态查找表动态查找表哈希表查找:在数据集合中寻找满足某种条件的数据元素的过程。查找表:用于查找的数据集合,由同一类型(或记录)的组成,可以是一个数组或链表等数据类型。关键字:数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。平均查找长度:查找时,关键字比较次数的平均值。静态查找表查询某个特定的数据元素是否在查找表中,检索满足条件的某个特定的数据元素的各种属性。以下来分别介绍各种方法:顺序查找:又称线性查找,主要用于在线性表中进行查找对无序线原创 2021-02-20 22:59:17 · 157 阅读 · 0 评论 -
逆波兰式和波兰式
中缀表达式,前缀表达式(波兰式),后缀表达式(逆波兰式)中缀表达式就是我们常用的形式:1+2*6+1前缀表达式从右往左扫描,后缀表达式就是从左往右扫描作用:实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中缀表达式转换为复杂的逆波兰式?原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序此处简要说明一下中缀表达式(原式)转后缀表达式(逆波兰式)的原创 2021-06-13 21:05:29 · 2011 阅读 · 0 评论 -
寻找公共前缀
今天看到一个好赞的题目!!!分享一波编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。大佬的解法执行时间m/s,时间复杂度:T(n²)空间复杂度:O(n²)class Solution {public: string longestCommonPrefix(vector<string>& strs) { // 判断数组是否为空,若为空则返回空值,否则返回数组的第一个元素作为基数 string res原创 2020-12-24 10:29:04 · 655 阅读 · 0 评论 -
leetcode(67):二进制求和
题目:给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。数据:每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。1 <= a.length, b.length <= 10^4字符串如果不是 “0” ,就都不含前导零。用大整数相加的方法!class Solution {public: string addBinary(string a, string b) { int num1[10005] = {0}, num原创 2021-07-11 23:07:32 · 124 阅读 · 2 评论 -
数据结构:链表
线性结构,线性结构,链式存储/************************************************************************* > File Name: demo.c > Author: LiuHao > Mail: 2226958871@qq.com > Created Time: Mon 26 Apr 2021 07:57:55 PM CST *************************************原创 2021-04-26 20:49:38 · 96 阅读 · 0 评论 -
LeetCode:每日一题:绝对差不超过限制的最长连续子数组
这个题和我之前做的题有些像先直接暴力解题吧class Solution {public: int getmin(vector<int>& nums) { int minn = nums[0], i; for (i = 1; i < nums.size(); i++) { if (nums[i] < minn) { minn = nums[i]; }原创 2021-02-21 14:27:29 · 137 阅读 · 0 评论 -
数据结构:讨论链表的NULL值的确定
讨论链表的NULL值的确定创建一个链表增加结点删除结点反转链表本章探讨主要以单链表的基本操作为主,增删改查一般的单链表结构体定义typedef struct Node { int data; // 数据域 struct Node* next; // 指向下一个结点}Node, *LinkList;创建一个链表创建一个空链表// 令其实例化指向NULLLinkList linkedlist = NULL;释放内存// 请在下面实现函数 clearvoid clear原创 2021-04-30 00:32:23 · 1922 阅读 · 0 评论 -
leetcode(7)整数反转
整数反转是一个老问题了,只不过这里有点诡异,因此拿出来分析分析看题目先:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。就是说超过了int范围返回0#include <cmath>int reverse(int x) { int p = 0; while (x) { p =原创 2021-06-10 16:55:03 · 74 阅读 · 0 评论 -
线性表:链式表示形式
好久没熬夜了(两天嘿嘿嘿)好久没摸键盘了(一个星期左右吧)借着兴奋劲,来写写博客,记录学习的瞬间先来看看线性表的定义:一个线性表是n个数据元素的有限序列,可以表示成:(2,3,6,8,9)在稍复杂的线性表中,一个数据元素可以由若干个数据项组成,在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称文件(吧啦吧啦好多)直接开门见山:线性表的链式表示和实现导言:线性表的链式存储结构是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数原创 2021-02-21 23:53:18 · 263 阅读 · 1 评论 -
LeetCode 23: 合并K个升序链表
目录题目思路c++代码你知道的越多,你知道的越少。上一篇:LeetCode 25: K个一组翻转链表题目给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->原创 2021-11-21 17:49:23 · 137 阅读 · 0 评论 -
OJ:538图的遍历(深度搜索)、528关系网络(广度搜索)
538—题目:读入一个用邻接矩阵存储的无向图,输出它的深度优先遍历序列。(以 1 为起点,按照编号越小权值越大的规则)示例:80 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0思路:深度优先搜索(递归)遍历该二维数组的每一个一维数组,并标记该数组为1(结点已经被遍历过)遍历每一原创 2021-07-19 21:47:49 · 402 阅读 · 0 评论 -
数据结构(C++):栈的应用
C语言的栈实现起来实在麻烦,而且只是逻辑上的删除等等操作,我不太喜欢,所以在此直接用C++的栈了。(等以后啥时候用得上再学C的自造栈吧嘿嘿嘿)C++的stack是C++的标准库之一,相关了解可以在《STL源码解析》一本书中寻得,当然,如果只是用的话,不必知道这些底层的分配器,迭代器,容器,算法,泛型等等#include <stack>直接贴上栈的操作吧// 构造函数stack<T> stk; // stack采用模板类实现,stack对象的默认构造形式stack(co原创 2021-02-22 17:39:28 · 755 阅读 · 0 评论 -
LeetCode每日一题:旋转链表
题目:给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数class Solution {public: ListNode* rotateRight(ListNode* head, int k) { ListNode* cur = head; int j = 1; while (cur != NULL && cur->next != NULL) { cur = cur->原创 2021-02-22 14:32:16 · 137 阅读 · 0 评论 -
LeetCode 300.最长递增子序列
目录题目思路c++代码题目给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例1输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例2输入:nums = [0,1,0,3,2,3]输出:4示例3输入:nums = [7,7原创 2021-10-18 19:18:14 · 165 阅读 · 0 评论 -
分治算法知识点整理
分治法——见名思义,即分而治之,从而得到我们想要的最终结果。分治法的思想是将一个规模为N的问题分解为k个较小的子问题,这些子问题遵循的处理方式就是互相独立且与原问题相同。(可以使用递归)两部分组成:分(divide):递归解决小的问题v治(conquer):然后从子问题的构建原问题的解三个步骤:分解(divide):将原问题分解为若干个规模较小、相互独立,与原问题形式相同的子问题解决(conquer):若子问题规模较小而容易被解决则直接解决,否则递归的解各个子问题合并(combine)原创 2021-10-09 22:07:33 · 184 阅读 · 0 评论 -
数据结构:树与二叉树
二叉树树树的性质满二叉树完全二叉树建立二叉树二级指针一级指针五种遍历方法判断二叉树的深度线索二叉树树的存储结构双亲表示法孩子表示法带双亲的孩子链表孩子兄弟表示法最优二叉树(赫夫曼树)固定长度编码可变长度编码二叉排序(查找)树(BST)查找插入删除平衡二叉树(AVL)B和B+树红黑树前言:害,整了挺久,找了挺多的建树的C代码,结果,每一个用得上的树的一种非线性结构,他的一个节点不止有一个前驱结点和一个后继结点,而是有多个// 函数参数不支持对指针用取址好&树树的性质1)有且仅有一个特定的原创 2021-04-08 18:18:07 · 1266 阅读 · 0 评论 -
Euler project:1 -10
Description:If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.Question:Find the sum of all the multiples of 3 or 5 below 1000.#include<iostream>#include <vector>原创 2021-05-31 21:24:03 · 146 阅读 · 0 评论 -
数据结构:循环链表与约瑟夫环问题
循环链表即表示链表头尾相接,从任意一个结点出发可以访问到任意一个节点,需要注意的是,在循环链表中,头结点即是尾结点单链表变成循环链表的改进head->next = head;当插入节点为头结点的时候// 先让该结点指向头结点的下一个结点node->next = head->next;// 让尾结点指向该结点head->next = node;在遍历前,第一个结点应该改成head尾结点的下一个结点,即Node *current_node = head->ne原创 2021-05-06 19:02:35 · 505 阅读 · 0 评论 -
算法思想:回溯
来源可见忒休斯的法宝古希腊神话故事(有点扯哈哈哈哈,不过大致思想差不多)忒休斯的高招,和现代计算机中求解很多问题的算法有异曲同工之妙,很多应用问题的解,在形式上都可以看做若干元素按特定次序构成的一个序列通常,其搜索空间的规模与全排列大体相当,为n! = O(n**n),因此若使用蛮力策略,逐一生成可能的候选解并检查其是否合理,则必然无法将允许时间控制在多项式的范围以内。剪枝出场。根据候选解的某些局部特征,以候选解子集为单位批量的排除。这种从长度上主句向目的解靠近的尝试,称为试探作为解的局部特征,原创 2021-03-24 00:38:03 · 78 阅读 · 0 评论 -
OJ刷题:#173统计字符个数
题目:输入一行字符,分别统计出其中英文字母,数字,空格,其它字符的个数。code#include <iostream>#include <cctype>#include <string>#include <map>void stat() { using std::string; using std::cin; using std::getline; using std::cout; using std::e原创 2021-06-03 15:36:57 · 259 阅读 · 0 评论 -
串的存储、模式匹配和KMP算法
串:即字符串,string,是由多个或零个字符组成的有限序列子串:串中任意个连续的字符组成的子序列串是一种特殊的线性表,数据元素之间呈现线性关系存储结构顺序存储#define MAXSIZE 25typedef struct { // 静态存储(定长数组) char ch[MAXSIZE]; int length;}sstring;typedef struct { // 动态存储(堆分配) char ch*; int length;}sstring;sstring s;s原创 2021-02-17 16:46:15 · 319 阅读 · 3 评论