数据结构和算法
所有实例用C++求解
橙子砰砰枪
即使盗版书也看的津津有味
展开
-
C++实现八叉树
【代码】C++实现八叉树。原创 2022-10-24 21:18:30 · 1053 阅读 · 0 评论 -
C++实现跳表
【代码】C++实现跳表。原创 2022-10-24 21:17:50 · 468 阅读 · 0 评论 -
C++单链表倒置-头插法+递归法
// 单链表倒置#include <iostream>#include <functional>#include <thread>using namespace std;struct Node{ int data; struct Node *next;};class ListInversion{private: struct Node *head; void Func(struct Node *p);public原创 2022-03-18 22:05:22 · 851 阅读 · 0 评论 -
C++十行代码的快速排序-C++11
全部使用C++11新特性,使用递归方法,FP式编程。template<typename T>list<T> sequential_quick_sort(list<T> input){ if(input.empty()) { return input; } list<T> result; // 将input中的input.begin()这个元素转移到result.begin()的位置 // 不原创 2022-03-21 14:34:02 · 723 阅读 · 0 评论 -
C++基于深搜和减治法的拓扑排序
基于深搜/** 拓扑排序是对有向无环图AOV的排序* 拓扑排序适用场景:有一项流水线作业,有先后完成的顺序,将作业排序* 这里只考虑两种实现方式:1.基于深搜 2.减治法* 如果图只有一个入度为0的点,那么深搜的结果就是拓扑排序的结果* 如果入度为0的点不止有一个,那么结果就不一定正确,所以要在深搜的基础上进行一些改进* 改进方法,在出栈的时候再访问,然后将访问过的节点倒序,就是拓扑的结果* 如果适用迭代,注意入度为0的点需要单独判断,因为它没法入栈*/#include <vec原创 2021-10-28 22:00:24 · 407 阅读 · 0 评论 -
C++无向图的深度优先搜索和广度优先搜索
深度优先搜索// 无向图的邻接矩阵表示法实现深搜#include <vector>#include <iostream>using namespace std;#define MAX 5 //节点数量char node[MAX]; //存储节点的容器int node_edge[MAX][MAX]; //邻接矩阵vector<char> dfs; //算法实现的辅助栈bool visited[MAX]; //记录已经访问过的节点void InPut()原创 2021-10-28 21:57:28 · 895 阅读 · 0 评论 -
C++ 一种流行但是低效的排序——冒泡排序
时间复杂度 O(n2)稳定性:稳定的排序算法C++:void bubble_sort(T arr[], int len){ int i, j; T temp; //外层循环为排序趟数 for (i = 0; i < len - 1; i++) { //内层循环为每趟比较的次数 for (j = 0; j < len - 1 - i; j++) { //每次比较相邻的两个,把大的交换到原创 2021-10-12 21:01:09 · 131 阅读 · 0 评论 -
C++ 剑指Offer51.归并排序的应用之一——逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5限制:0 <= 数组长度 <= 50000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。在归并排序的思路中,我们总是分开解决一半原创 2021-10-11 23:30:05 · 152 阅读 · 0 评论 -
煎饼排序-迭代
煎饼排序:给你一个整数数组 arr ,请使用 煎饼翻转 完成对数组的排序。一次煎饼翻转的执行过程如下:选择一个整数 k ,1 <= k <= arr.length反转子数组 arr[0…k-1](下标从 0 开始)例如,arr = [3,2,1,4] ,选择 k = 3 进行一次煎饼翻转,反转子数组 [3,2,1] ,得到 arr = [1,2,3,4] 。以数组形式返回能使 arr 有序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * arr.length原创 2021-10-10 17:22:23 · 243 阅读 · 0 评论 -
汉诺塔与受限汉诺塔
经典汉诺塔:将盘子从a,借助b,移动到c受限汉诺塔:将盘子从a,借助b,移动到c,但是每次只能移入到b或者从b移出。#include <iostream>using namespace std;int num_hanoi = 0;int num_limited_hanoi = 0;//借助b,把盘子从a移动到cvoid hanoi(int n, char a, char b, char c){ //if only one if (n == 1) { num_hano原创 2021-10-08 15:53:33 · 647 阅读 · 0 评论 -
秦九韶算法与霍纳规则
霍纳规则用来简化多项式的求值,在中国叫秦九韶算法。一般地,一元n次多项式的求值需要经过(n+1)*n/2次乘法和n次加法,而秦九韶算法只需要n次乘法和n次加法。在人工计算时,一次大大简化了运算过程。把一个n次多项式:改写成如下形式:求多项式的值时,首先计算最内层括号内一次多项式的值,即V1=an*x+a n-1然后由内向外逐层计算一次多项式的值,即这样,求n次多项式f(x)的值就转化为求n个一次多项式的值。结论:对于一个n次多项式,至多做n次乘法和n次加法。//秦九韶算法#incl原创 2021-10-07 21:29:09 · 604 阅读 · 0 评论 -
扑克排序规则——插入排序
时间复杂度 - O(n2)插入排序对于一个少量元素的排序来讲,是一个有效的算法。插入排序像人排序一手扑克牌,开始时人左手为空,桌子牌牌面朝下,每次从桌子上拿一张牌放到左手,并遍历左手的牌,将这张牌插入到合适的位置,所以左手的牌永远是有序的。伪代码:INSERTION-SORT(A)for j = 2 to A.length; key = A[j]; //insert A[j] into the sequence A[1..j-1] i = j - 1; while i>0 and A原创 2021-10-06 23:09:49 · 297 阅读 · 0 评论 -
初遇分治算法——归并排序
时间复杂度:O(nlogn)许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关的若干子问题。这些算法典型地遵循分治法的思想:将几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。分治模式在每层递归时都有三个步骤:1.分解原问题为若干子问题,这些子问题时原问题的规模较小的实例。2.解决这些子问题,递归地求解各子问题。然后,若子问题的规模足够小,则直接求解。3.合并这些子问题的解成原问题的解。...原创 2021-10-06 23:10:10 · 98 阅读 · 0 评论 -
求最长公共前缀
题目表述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。输入:strs = [“flower”,“flow”,“flight”]输出:“fl”输入:strs = [“dog”,“racecar”,“car”]输出:""解释:输入不存在公共前缀。解题思路:使用递归,以此从容器中取出一个string,并和后一个string比较,得出公共前缀。class Solution {public: string longest(string&原创 2021-07-12 22:33:15 · 194 阅读 · 0 评论 -
验证有效括号
题目描述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。输入:s = “()”输出:true输入:s = “()[]{}”输出:true输入:s = “(]”输出:false输入:s = “([)]”输出:false输入:s = “{[]}”输出:true提示:1 <= s.length <= 104s 仅由括号 ‘()[]{}’原创 2021-07-13 21:33:19 · 243 阅读 · 4 评论 -
合并两个有序链表
题目描述:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]输入:l1 = [], l2 = []输出:[]输入:l1 = [], l2 = [0]输出:[0]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.val <= 100l1 和 l2 均按 非递减顺序 排列解题思路:直接通过指针的连接与断开,将其合并,不原创 2021-07-14 22:34:19 · 174 阅读 · 1 评论 -
删除有序数组中的重复项
题目描述:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicat原创 2021-07-21 20:16:13 · 177 阅读 · 0 评论 -
移除容器指定元素
题目描述给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝原创 2021-07-21 21:27:06 · 227 阅读 · 0 评论