CCC_bi
这个作者很懒,什么都没留下…
展开
-
C++ 查找最长公共子串
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。原创 2024-09-15 06:05:40 · 203 阅读 · 0 评论 -
C++ 链表
C++提供了list容器,这是一个双向链表,能高效进行数据添加和删除。原创 2024-09-15 05:36:05 · 280 阅读 · 0 评论 -
C++动态规划
通过将复杂问题分解为较小的子问题,并保存这些子问题的解来避免重复计算,动态规划可以显著提高效率。通俗来说,能找到一个同学,他的两边的同学身高都依次严格降低的队形就是合唱队形。我们在解决这个问题时,采用动态规划问题,以同学i为目标,用dp1[i]表示从起点到i的正向最长递增子序列,用dp2[i]表示从终点到i的反向最长递增子序列。动态规划通常采用自底向上的方式,通过求解所有子问题,逐步构建最终问题的解。计算顺序:根据状态转移方程,通常采用自底向上的计算方式,从初始条件开始逐步计算更大的问题。原创 2024-09-09 21:51:30 · 297 阅读 · 0 评论 -
C++ 二分查找
二分查找 Binary Search, 是一种针对有序数组的基本查找算法。其基本思想是,将待查找区间一份为二,与中间元素进行比较,根据大小确定进一步搜索的子区间,从而逐步缩小查找范围,时间复杂度为Ologn。原创 2024-09-06 23:38:23 · 141 阅读 · 0 评论 -
C++ 栈的使用
在 C++ 中,栈(Stack)是一种后进先出(LIFO,Last In First Out)的数据结构,表示最后插入的元素最先被移除。C++ 提供了 STL(Standard Template Library)中的 std::stack 容器适配器来方便使用栈。原创 2024-09-06 22:44:15 · 339 阅读 · 0 评论 -
C++跳台阶问题(斐波那契数列问题)
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。原创 2024-08-28 02:43:40 · 132 阅读 · 0 评论 -
C++ 字符串长度
输入一个字符串,输出该字符串中有多少个不同的字符。原创 2024-08-28 01:40:21 · 100 阅读 · 0 评论 -
C++核心技术
当一个普通函数访问另一个类的成员函数时,不能直接访问另一个类的私有数据成员,必须间接的通过访问公有成员实现,这会降低程序运行的效率。相同类的对象具有相同的属性和行为,对象分为两个部分,数据和行为。如果两个基类溯源时同一个基类的派生类(如C是最终的派生类,继承自两个基类A 和 B,A 和 B又是基类Z的派生类),那么有些成员就会被C继承两次,既增加了存储占用,又带来了二义性的问题。C++作为“带类的C语言”,其面向对象编程的相关知识可以说是其核心技术,相关概念包括:类,对象,命名空间,继承,多态和重载。原创 2024-08-22 04:11:45 · 97 阅读 · 0 评论 -
手写数字识别——使用MATLAB,python的实现
第一种方法:读取MATLAB安装时自带的数据(只有10000)第二种,读取网络下载的Mnist数据集。原创 2024-03-11 00:51:06 · 266 阅读 · 0 评论 -
图论——最短路径
初始化: 创建一个集合S,用于存储已找到最短路径的顶点,以及一个数组dist,用于存储从起始顶点到各个顶点的最短路径长度。找到最短路径: 从未访问的顶点中选择距离起始顶点最近的顶点,将其标记为已访问,并更新与该顶点相邻的顶点的最短路径距离。一个公司,要买一台机器,为了确保未来5年,机器能正常工作,需要再每年的开始,确定对机器进行维修,或是更换一个新的机器。在每次迭代中,都选择未访问的顶点中距离起始顶点最近的顶点。该算法的基本思想是通过逐步考虑所有的顶点,以顶点作为中间节点,不断更新各对顶点之间的最短路径。原创 2024-01-31 06:27:47 · 671 阅读 · 0 评论 -
运筹学代码基础(python)
我们已经了解了使用python求解线性规划问题的基本问题,接下来,我们通过几个例题,进一步探究使用python求解模运筹学相关问题的方法。这到题中变量的类型由整形进一步限制为0和1的binary,在建模时需要对决策变量的类型加以限制,来满足这一限制条件。对于上节同样的问题,我们用矩阵的形式表示问题中涉及的参数和系数,求解问题如下。对于一个图,一个割集是边集的一个子集,最小生成树问题可以表示为。我们随机生成一个图,来进行最小生成树的生成。求解过程中,我们引入两个新的库。同样的,随机生成图来进行求解。原创 2024-01-31 04:11:17 · 240 阅读 · 0 评论 -
打乱数组demo
给定一个数组,返回打乱后的数组,每种打乱的结果要等可能的返回。这里使用到了洗牌算法。原创 2022-09-07 13:35:32 · 196 阅读 · 0 评论 -
矩阵中的路径
给定一个矩阵,矩阵的每一个元素是一个字母。给定一个单词,判断能否由相邻字母构成。深度优先搜索(DFS):从根节点开始,沿着一条树枝走到底,若没有完成搜索目标,则返回到上一个节点,从另一条路走到底。可以使用递归实现。1.标记已经搜索到的元素。2.搜索下一个单元格。3.还原当前的矩阵元素。1.找到搜索目标2.可以确定无法找到搜索目标,或是已到边界,或是已经搜索过。1.遍历每个起点2.判断是否到终止条件3.扩散当某一条支路不可能搜索到目标时,立即返回到上一个节点,减少搜索量。...原创 2022-06-28 11:55:41 · 131 阅读 · 0 评论 -
数组中的逆序对(分治算法)
前一个数字大于后某一数字,这两个数字构成一个逆序对。归并排序暴力查找Vector向量容器求解一个数组种的逆序对数目,可以通过暴力查找实现,也可以通过归并的思想实现。归并排序是一种与逆序对关系紧密的排序方法,是分治算法的一种,充分体现了分而治之的算法思想。其分的过程,即通过二分法,将长数组不断划分为短数组,将长数组排序的问题转换为短数组排序的问题。其治的过程,即从长度为1的数组长度开始向上合并,不断的将较短的数组合并为较长的数组,直至合并为原长度数组。合并的过程就是不断的排查逆序对的过程,当左子数原创 2022-06-18 22:40:28 · 474 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5vwbf6/描述 给定一个整数数组,判断给数组是不是某二叉搜索树的后序遍历结果,如果是,则返回true,否则返回false。分析后序遍历:左字数->右子树->根节点二叉搜索树:左子树的所有节点的值小于根节点的值,而右子树的所有节点的值大于根节点的值,而左右子树也是二叉搜索树,即也满足这些数量关系。递归解法通过递归的方法来判断子树的正确性。终止条件:当子转载 2022-02-25 17:17:47 · 230 阅读 · 0 评论 -
股票的最大利润(动态规划)
描述:假设将股票的价格按照时间先后顺序储存在数组中,亲吻一次买卖可以获得最大利润是多少。买卖肯定是先买后卖,而只有当卖出去的价格高于买入价时,才可以获得利润,因此,题目实质就是找一对增长的数,使他们之间的差最大。动态规划分析状态定义:dp[i]表示以s[i] 为结尾的最大利润。初始状态: d[0]=0转移方程:dp[i]=max{dp[i-1], s[i]-min(s[0:i])}返回值;dp[n-1]class Solution {public: int maxProfit(v原创 2022-02-24 19:46:12 · 265 阅读 · 0 评论 -
寻找最长不含重复的子字符串(动态规划)
描述 从字符串中找出一个最长的不包含重复字符的子字符串,返回该子字符串的长度。动态规划分析: 长度为N的字符串,有(1+N)*N/2 个子字符串,状态定义:dp[j],代表以字符s[j]为结尾的最长不重复子字符串的长度。初始状态:转移方程:固定右边界j,设在s[j]左侧,且与s[j]距离最近的相同字符为s[i];若左侧无相同字符,则dp[j]=dp[j-1]+1;若dp[j–1]<j-i 则 dp[j]=dp[j-1]+1;dp[j-1]>=j-i;返回值:最长的子字符转载 2022-02-24 18:38:35 · 889 阅读 · 0 评论 -
寻找丑数(动态规划)
描述 把只包含质因子2,3,5的数称为丑数,按从小到大的顺序求第n个丑数。 质因子在数论中指能整除给定正整数的质数。丑数只包含质因子2,3,5,因此丑数一定等于某因子*某丑数。即丑数只可能包含a*2b*3c*5 可以得到的丑数递推公式。X=min(a2,b3,c5).且a为2后首个大于第n个丑数的丑数,b为3后首个大于第n个丑数的丑数,c为5后首个大于第n个丑数的丑数。动态归化分析:状态定义:设动态规划列表dp,dp[i]为第i+1个丑数。初始状态:dp[0]=1,dp[1]=1转原创 2022-02-23 19:13:01 · 294 阅读 · 0 评论 -
青蛙跳台阶问题(动态规划例题)
问题描述 假设有一个青蛙,一次跳跃可以跳一个台阶或两个台阶,那么青蛙跳上n级台阶,总共有几种跳法呢。状态定义:跳上i阶台阶的共有dp[i]种跳法起始状态:dp[0]=1,dp[1]=1,dp[2]=2状态转移: 分析可知,上第n阶台阶相当于第n-1阶台阶向上跳一个台阶,第n-2个台阶向上跳两个台阶。 即可以认为第n阶台阶的总跳法=第n-1阶台阶的总跳数+第n-2阶台阶的总跳数。dp[i]=dp[i-1]+dp[i-2];返回值:跳上n级台阶总共有的跳发dp[n];&emsp;原创 2022-02-23 17:43:57 · 824 阅读 · 0 评论 -
C++学习:二分查找
二分查找 二分查找也称之为折半查找,该查找针对的是有序数组。其算法较为简单,每次查找,将目标值与数组中值进行对比,若目标值大于中值,则在中值左侧的子数组中重复上述操作,若目标值小于中值,则在中值右侧的子数组中重复上述操作。int BinarySearch(vector<int> &nums,int target){ int left=0; int right =nums.size()-1; while(left <= right) {原创 2022-02-22 23:00:46 · 386 阅读 · 0 评论 -
寻找数组中出现次数最多的值
可以按照哈希表,循环遍历即可。当众数的数目超过一半时,还可以采用摩尔投票法。class Solution {public: int majorityElement(vector<int>& nums) { int vote=0; int x=0; for(int num :nums) { if(vote == 0) x=num; if(x==num) vote++; if(x!=num) vot原创 2022-02-21 23:52:21 · 368 阅读 · 0 评论 -
C++学习:排序算法
文章目录冒泡排序快速排序归并排序插入排序选择排序冒泡排序 使用两个指针,从左向右遍历元素,若左元素大于右元素,则交换两个元素,遍历一遍后,最大元素就会转移到最右侧,剩余n-个元素重复该循环,直到所有元素移动到了正确位置。#include<iostream>#include<vector>#include<stdio.h>using namespace std;void bubblesort(vector<int> &nums){原创 2022-02-21 23:26:10 · 586 阅读 · 0 评论 -
数组中数字出现的次数——寻找只出现一次的数字
数组中数字出现的次数 数组中有两个数字只出现了一次,而其他数字出现了两次,找到这两个数字。 分析:通过异或来提高算法速度,两个相同数字的异或为0,假设只出现一次的数字为A和B,数组所有元素进行异或,可以得到值为A异或B。接下来就需要将A和B从该值中提取出来。由于A和B是两个不同的数字,则其二进制至少有一位是不同的,即可以根据该位的值是0还是1,将数组分为两拨。如该位的值为0的元素有[A,C,D,F],该位上的值为1的元素[B,E,G]。分别异或操作两个子数组,得到的值就是只出现一次。题解参考自:ht原创 2022-02-21 15:11:24 · 8840 阅读 · 0 评论 -
复杂链表的复制
复杂链表的复制 复制一个复杂链表,该链表既有指向下一个节点的指针,还有一个指向链表的任意节点。 普通链表的节点由该节点的值val和指向下一个节点的指针。原创 2022-02-20 21:32:42 · 444 阅读 · 0 评论 -
查找数组中元素重复的次数
查找数组中元素重复的次数 如题,直接遍历即可。class Solution {public: int search(vector<int>& nums, int target) { int temp=0; for(int i : nums) { if(i==target) temp++; } return temp; }};...原创 2022-02-19 16:53:52 · 677 阅读 · 0 评论 -
寻找数组中的重复元素
寻找数组中的重复元素 本题较为简单,直接用哈希表储存某值是否存在,遍历数组,更新哈希表即可。class Solution {public: int findRepeatNumber(vector<int>& nums) { unordered_map<int, bool> hashlist; for(int i : nums) { if(hashlist[i]) {原创 2022-02-19 16:39:53 · 338 阅读 · 0 评论 -
左旋转字符串
左旋转字符串 左旋转字符串值将字符串开头的几个数字移到最后。class Solution {public: string reverseLeftWords(string s, int n) { string str; str=s+s; int size=s.size(); string restr; for(int i = n ; i < (n+size) ; i++) {原创 2022-02-18 21:16:23 · 140 阅读 · 0 评论 -
翻转链表.
翻转链表: 给一个链表的头,返回翻转后链表的头. 解法: 遍历链表,遍历访问各个节点时,修改next指向,class Solution {public: ListNode* reverseList(ListNode* head) { ListNode *ptrA = head; ListNode *ptrB = nullptr; while(ptrA) {原创 2022-02-18 18:59:18 · 104 阅读 · 0 评论 -
定义栈的数据结构
定义包含min,pop,push函数的栈数据结构 要求,每个函数的时间复杂度为O(1) 分析: 栈的出栈和入栈都复杂度都为O(1),可以直接使用入栈,出栈函数,但是min函数需要遍历整个栈,其时间复杂度为O(N),如果想要其时间复杂度为O(1),就需要确保,在调用函数前,就已经知道最小值位于函数的哪个位置,可以用一个辅助栈来储存最小值。用辅助栈而不采用单个变量存储的原因在于栈的入栈出栈后会改变当前栈内的元素。出栈操作有可能将当前栈中的最小值出栈,因此需要一个有记忆功能的数据结构来储存最小值,栈是比较原创 2022-02-17 17:39:01 · 345 阅读 · 0 评论 -
用两个栈实现队列
用两个栈实现队列 用两个栈模拟队列在尾部插入整数和在队列头部删除对象的能力。 分析可知,队尾插入元素,相当于入栈,直接用入栈操作就可以解决。而删除队首元素,相当于将栈逆序,然后出栈。class CQueue {public: stack<int> stacka,stackb; CQueue() { } void appendTail(int value) { stacka.push(value); //模拟队尾插入,直接入栈。原创 2022-02-13 22:31:03 · 229 阅读 · 0 评论 -
倒序输出链表
给定链表,将链表上的元素逆序输出 解题思路,后入先出,这是栈的思想,可以用一个辅助栈将链表上的元素进行逆转。1.将链表上的数据复制到栈中。2.将栈上的元素逐个出栈,直到栈为空。可以用vector来储存,而不必考虑内存大小。3.将储存了逆序元素的容器返回。题解/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int原创 2022-02-11 23:46:37 · 1518 阅读 · 0 评论 -
替换字符中的字符
题目 请将给定字符串中的‘c’替换为%50;题解对于C++和C语言来说,可以用在对应位置直接修改元素的方法来修改字符串,也可以用生成一个新的字符串的方法来解决。%采用生成新的字符串的方法class Solution {public: string replaceSpace(string s) { string re_string; for(int i=0;i<s.size();i++) { if(s[i]=='原创 2022-02-11 14:50:53 · 354 阅读 · 0 评论