数据结构与算法
文章平均质量分 82
数据结构与算法专栏
梦码城
以梦为码,不负韶华
展开
-
常用的排序算法
本文目录1. 冒泡排序2. 选择排序3. 插入排序4. 堆排序4. TopK问题5. 排序数组中找指定和的因子6. 判断数组的包含问题7. 数组能排成的最小数8. 需排序的子数组长度1. 冒泡排序算法思路:第一趟,通过两两交换的手段,将最大元素顶到最末端第二趟,将次大元素顶到倒数第二个位置…………………………………………时间复杂度:O(n²)空间复杂度:O(1)原址排序稳定性:有相同元素,排序前和排序后相对位置不会变化,稳定代码:package 排序;/** * @autho原创 2022-04-10 16:01:04 · 1024 阅读 · 0 评论 -
深度优先搜索算法(DFS)
本文目录1. DFS算法一般步骤2. 数独3. 部分和4. 水洼数目5. n皇后问题6. 素数环7. 困难的串1. DFS算法一般步骤void dfs(int step){ if(边界成立) { 走到最深处 。。。。。。 return; } for(尝试每一种可能的状态) { if(如果这种状态可行){ //剪枝 把这种可能的状态标记,表示走过 继续下一步dfs(step+1) //状态转移 把这原创 2022-04-10 15:49:31 · 702 阅读 · 0 评论 -
位运算算法
本文目录位运算的技巧1. 二进制数中1的个数2. 是不是2的整数次方3. 找出唯一成对的数位运算的技巧^为二进制异或运算符:相同为0,相异为11.判断奇偶数:与 1 进行异或操作,为0则为奇数,为1则为偶数2.交换两个整数变量的值:a=ab,b=ab,a=a^b;3.求整数的绝对值:对补码的所有位取反,然后加1,可得到该补码对应的负数的绝对值。4.交换律:a^b = b^a5.结合律:(ab)c = a(bc)6.对于任何数x,都有x^x = 0, x^0 = x, 即同自己求异或为0原创 2022-04-10 16:04:41 · 616 阅读 · 0 评论 -
逐步生成式递归
本文目录1. 走楼梯2. 机器人走格子3. 非空子集(递归|迭代)4. 非空子集(二进制)5. 全排列(迭代)6. 全排列(递归回溯法)7. 全排列(前缀法)8. 全排列(抽取法)9. 合法括号10. 硬币表示1. 走楼梯问题描述:有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。请实现一个方法,计算小孩有多少种上楼的方式。为了防止溢出,请将结果Mod 1000000007给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100000。思路解析:原创 2022-04-10 16:05:19 · 602 阅读 · 0 评论 -
分治 算法
本文目录1. 超过一半的数2. 超过一半以上的数3. 快速排序4. 乱序数组中查找第k位1. 超过一半的数问题描述:数组中有一个数字出现的次数等于数组长度的一半,找出这个数字。package 分治法;/** * @author: DreamCode * @file: 超过一半以上的数.java * @time: 2022年2月27日-下午4:40:11 */public class 超过一半的数 { public static void main(String[] args)原创 2022-04-10 15:58:27 · 385 阅读 · 0 评论 -
贪心 算法
本文目录1. 部分背包问题2. 乘船问题3. 区间调度问题4. 区间覆盖问题5. 区间选点问题6. 小船过河_往返问题7. 硬币支付问题8. 字典序最小问题9. 最优装载问题1. 部分背包问题问题描述有n个物体,第i个物体的重量为wi,价值为vi。在总重量不超过C的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。求最大总价值注意:每个物体可以只拿一部分,因此一定可以让总重量恰好为C。思路解析:贪心选择:总是选择单价较高的物品package 贪心算法;i原创 2022-04-10 16:03:29 · 807 阅读 · 0 评论 -
字符串中的算法
本文目录1. KMP算法查询字符串2. KMP_next数组的应用3. 单词翻转4. 后缀数组的应用_最长公共字串5. 回文字符串6. 判断两字符串的字符集是否相等7. 旋转词8. 移除字符串中连续出现的K个09. 最短摘要1. KMP算法查询字符串问题描述:使用KMP算法查询子串的位置代码:package 字符串;/** * @author: DreamCode * @file: KMP.java * @time: 2022年3月18日-下午7:28:08 */public c原创 2022-04-11 00:32:44 · 442 阅读 · 0 评论 -
动态规划算法
本文目录1. 硬币支付问题2. 钢条切割问题3. 数字三角形4. 完全背包问题5. 最大公共子序列6. 最长递增子序列的长度1. 硬币支付问题问题描述有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.现在要用这些硬币来支付A元,最少需要多少枚硬币?假定本题至少存在一种支付方案.0≤ci≤10^90≤A≤10^9输入:第一行有六个数字,分别代表从小到大6种面值的硬币的个数第二行为A,代表需支付的A元样例:输入3 2 1 3 0原创 2022-04-10 15:56:10 · 197 阅读 · 0 评论 -
常用数论算法
本文目录1. 天平称重问题2. Nim游戏3. 阶梯尼姆博弈问题4. 高僧斗法5. 欧几里得算法6. 扩展欧几里得算法7. 一步之遥8. 青蛙约会9. 模的逆元10. 同余方程组11. 素数_埃氏筛法12. 快速幂运算1. 天平称重问题问题描述:用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。如果只有5个砝码,重量分别是1,3,9,27,81 则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。本题目要求编程实现:对用户给定的重量,给出砝码组合方案。例如:用原创 2022-04-10 16:02:26 · 418 阅读 · 0 评论 -
算法中的矩阵
本文目录1. Z形打印二维数组2. 边界为1的最大方阵3. 边界为1的最大方阵_优化4. 将0所在的行列清零5. 顺序打印二维数组1. Z形打印二维数组问题描述:按照Z字型打印二维数组思路解析:逐步模拟即可。按照从左到右于从右到左交替打印。分别考虑以下情况:从左到右打印:当前位于第一行,向右走;当前位于最后一列,向下走从右到左打印:当前位于第一列,向下打印;当前位于最后一行,向右打印package 矩阵;/** * @author: DreamCode * @file: Z形原创 2022-04-10 15:59:43 · 288 阅读 · 0 评论 -
递归与二分法
本文目录1. 递归基础知识2. a的n次幂3. 小白上楼梯4. 旋转数组的最小数字5. 在有序含空字符串的数组中查找6. 最长连续递增子序列1. 递归基础知识1. 找重复1、找到一种划分方法2、找到递推公式或者等价转换都是父问题转化为求解子问题2. 找变化的量变化的量通常要作为参数3.找到出口根据参数变化的趋势,对边界进行控制,适时终止递归4.递归规模5. 2的指数阶的大小关系1000000000(十亿)大概为230,所以如果复杂度达到2n次方,这里的n只能到达30左右,否则容易原创 2022-04-10 15:54:20 · 614 阅读 · 0 评论 -
数据结构(图)
1. 基于邻接矩阵存储的有向图,求出度为零的顶点个数【问题描述】基于邻接矩阵存储的有向图,设计算法求出度为零的顶点个数。【输入形式】第一行输入图的顶点个数verNum和边的个数edgeNum,用于构造图。第二行顶点信息;接下来edgeNum行,每行描述一条边的信息,即起点、终点,以及边上的整型权值。【输出形式】出度为零的顶点个数。【样例输入】6 9A B C D E FA B 34A C 46A F 19B E 12C D 17C F 25D E 38D F原创 2021-01-04 12:55:21 · 1186 阅读 · 0 评论 -
数据结构(树和二叉树)
1. 前序打印叶子结点【问题描述】设计算法,要求按照前序遍历方式打印二叉树的叶子结点。【输入形式】一行字符串,该行是扩展二叉树的前序遍历序列,用于构造二叉树。【输出形式】二叉树的前序叶子遍历序列(中间用空格隔开)。【样例输入】AB#D##C##【样例输出】D C#include <iostream>#include <string>using namespace std;struct BiNode { char data; BiNode *L_child;原创 2021-01-03 16:28:49 · 1436 阅读 · 0 评论 -
数据结构(字符串和多维数组)
1. 字符串匹配(BF算法)【问题描述】给定两个字符串S和T,在主串中寻找字串T的过程称为模式匹配,T称为模式。如果匹配成功,返回T在S中的位置;如果匹配失败,返回0。【输入形式】两行,第一行是主串S,第二行是模式串T【输出形式】模式串T第一次出现在主串S中的位置。【样例输入】abcabcacbabcac【样例输出】4【样例说明】注意返回的是模式串在主串的位置,区别存储时的角标。【评分标准】注意读入字符时,有可能中间含有空格字符。所以可以用getline读取字符串。#include<原创 2021-01-03 15:25:44 · 1582 阅读 · 0 评论 -
数据结构(栈和队列)
1. 数制转换【问题描述】十进制数N和其他d进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理:N = (N div d) * d +(N mod d)其中div是整除运算,mod是求余运算。例如(2018)10= (3742)8= (7E2)16【输入形式】一个十进制数以及d进制数(2<=d<=16)【输出形式】该十进制数所对应d进制数【样例输入】2018 16【样例输出】7E2#include<iostream>using原创 2021-01-03 14:50:37 · 1368 阅读 · 0 评论 -
数据结构(链表)
1. 实验一 顺序表【问题描述】请阅读以下顺序表的实现代码,完善并实现顺序表的插入和删除操作。【举例】请输入顺序表的最大长度:20请输入顺序表的数据的个数:5请依次输入5个数据:2 4 6 8 10请输入插入数据的位置和数值:2 3执行插入操作后的顺序表:2 3 4 6 8 10请输入删除数据的位置:3执行删除操作后的顺序表:2 3 6 8 10#include<iostream>#include<stdlib.h>using namesp原创 2021-01-03 11:22:27 · 1029 阅读 · 0 评论 -
数据结构(绪论)
1. 循环左移将一个具有 n 个元素的数组A[n]向左循环移动k个位置,要求时间复杂度为O(n),空间复杂度为O(1)。#include<iostream> using namespace std;void reverseArr(int A[],int start,int rear){ while(start<rear) { int temp=A[start]; A[start]=A[rear]; A[rear]=temp; start++; r原创 2021-01-03 10:06:53 · 287 阅读 · 0 评论