算法/数据结构
文章平均质量分 52
MineYuer
咸鱼大学生
展开
-
动态规划练习
数字和为sum的方法数给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。 当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。 输入 5 15 5 5 10 2 3 输出 4思路:暴力不行。sum值是指定的,但是解空间肯定是最小单位为1进行增长,所以想到dp[i][j]表示前缀为 i ,能组成值为 j 的可能性个数。然后行...原创 2018-08-13 17:48:04 · 421 阅读 · 0 评论 -
最大子数组问题——算法导论
分治法思想 分解:子数组一定被原数组左边或者右边包含,或者跨越原数组mid下标。 解决:前两种完全包含的情况形成子问题递归求解,并且缩小了问题规模,后一种是我们要解决的问题。 合并:剩余的问题是求跨越mid的最大子数组,并且从三种情况中选出和最大的。另外 算导中伪代码返回的是三元组,这里实现的话用结构体返回坐标和值。#include <stdio.h>#include...原创 2018-04-25 22:12:10 · 548 阅读 · 0 评论 -
栈应用——括号匹配和逆波兰表达式
Stack声明见前文:https://blog.csdn.net/hanzheng6602/article/details/80053607 括号匹配 匹配串类似 “(()()abc{[]})”思路:一个指针遍历串,如是左括号入栈,右括号则出栈并于当前指针比较是否匹配。再指针指向\0,并且栈为空时才是匹配模式//匹配成功返回1int match_brackets(con...原创 2018-04-25 12:23:41 · 380 阅读 · 0 评论 -
最长公共子序列——动态规划
最长公共子序列——动态规划本题的最优子结构比较难找,书上直接给出了定理,定理给出三种情况两个串最后一个字母相等,那么最长序列等于两个串都除去最后一个字母的最长序列+1最后一个字母不相等,最长序列是两个串各除去最后一个字母后的最长序列的较大者。这样原问题的最优解就包含了子问题的最优解(除去最后一个字母的串的求解),符合最优子结构。根据子结构写出递归式,用二维数组记录解空间,然后...原创 2018-05-03 10:25:22 · 346 阅读 · 0 评论 -
矩阵链乘——动态规划
普通矩阵相乘算法//普通矩阵相乘#define ROW_A 2#define COL_A 2#define COL_B 3void matrix_mul(int matA[ROW_A][COL_A], int matB[2][COL_B], int C[ROW_A][COL_B]){ for (int i = 0; i < ROW_A; i++) { ...原创 2018-05-02 20:54:55 · 475 阅读 · 0 评论 -
带环链表求入口结点——带环链表处理
求两个单链表相交的交点— 链表不带环判断链表是否带环,返回相遇点获取环的入口点判断两个链表是否相交,链表可能带环求两个单链表相交的交点— 链表不带环不带环的两个链表,只有两种情况。一种是平行也就是不相交,要不然就会相交形成Y型或者头尾相连的一字型。而只要相交,两个链表的尾结点一定是相同的,所以思路很清晰,判断尾结点是否相等就知道是否相交。求交点:用两个指针,让...原创 2018-04-19 16:55:14 · 539 阅读 · 0 评论 -
求解带环迷宫的最短路径
求解带环迷宫的最短路径Stack和Position的声明请参考前文(栈走简单迷宫):https://blog.csdn.net/hanzheng6602/article/details/80053607结果:思路:和前文递归思路类似,只是为了解决绕环问题的话,需要对结点做个标记,用来更新最短路。用两个栈保存路径,一个存当前路径,一个存最小路径,如果当前找到了一种路径,就和最短路径做...原创 2018-04-23 18:01:11 · 529 阅读 · 0 评论 -
利用栈走迷宫
预备知识前置声明头文件:https://blog.csdn.net/hanzheng6602/article/details/80031130动态顺序表:https://blog.csdn.net/hanzheng6602/article/details/79917391拓展:带环迷宫求最短路https://blog.csdn.net/hanzheng6602/article/...原创 2018-04-23 17:31:09 · 895 阅读 · 0 评论 -
动态顺序表c语言实现
主要操作结构体中的指针,在init函数里对指针进行内存开辟,checkCapacity函数在每次插入之前检查一遍,如果可用空间没有了,就开辟当前最大容量的两倍。其他操作与静态顺序表无大区别。 seqList.h#pragma once#define DataType inttypedef struct seqList { DataType * array; ...原创 2018-04-12 17:37:31 · 500 阅读 · 0 评论 -
表示数值的字符串——剑指offer
这道题写起来比较繁琐,需要考虑+-号是否出现在第一个位置,.是否出现一次,以e为分割前后是不是正确的格式,e前可以为浮点数或者整数,e后只能是整数。 因此如果把函数分成三个子函数来写就好多了,一个函数判断是不是整数,一个判断是不是浮点数,一个判断e前后是否合法。#include <stdio.h>#include <windows.h>bool is_znum(c...原创 2018-03-29 10:59:14 · 464 阅读 · 0 评论 -
正则表达式匹配——剑指offer
这道字符串匹配很精妙,第一次我做这个题用循环模拟,但是遇到*号时需要尝试所有的可能,故写不下去了,尝试使用递归解。#include <stdio.h>#include <windows.h>bool matchCore(char*, char*);bool match(char* str, char* pattern){ if (str == NUL...原创 2018-03-28 22:43:21 · 449 阅读 · 0 评论 -
钢条切割——算法导论
自顶向下解法分解:将长度为n的钢条切割问题转为在i下标切割后长度为n-1的子问题 解决:递归求解子问题,每次长度参数-1,在n=0即不用切时递归终止 合并: 1. 每个子问题的解+前一段切割长度的arr[i]值 成为前一子问题的最优解 2. 原规模问题中的最优解是所有子问题解中值最大的//自顶向下int max_sum(int arr[], int n){ if...原创 2018-04-26 11:15:56 · 502 阅读 · 0 评论 -
二叉树非递归遍历,重建二叉树等面试题
二叉树非递归遍历先序头结点入栈,每次循环顺着左路一直找到底,先打印结点,遇右压栈就可以了。void PreOrderNorOP(pBTNode pRoot){ Stack s; init(&amp;s); pushBack(&amp;s, pRoot); while (!isEmpty(&amp;s)) { pBTNode pC...原创 2018-05-11 17:20:11 · 763 阅读 · 0 评论 -
海量数据处理(转)
海量数据处理(转)位图和布隆过滤器实现:https://blog.csdn.net/mxrrr_sunshine/article/details/80451189常见问题:https://blog.csdn.net/zhangye3017/article/details/79431449...转载 2018-06-27 15:02:26 · 880 阅读 · 0 评论 -
哈希搜索(多次探测,哈希桶)
哈希搜索(闭散列,开散列) 为什么提出哈希?顺序搜索和二叉树搜索中,元素存储位置和元素关键码之间没有联系。因此在查找一个数据时,必须经过关键码的多次比较,搜索效率取决于比较次数。而一个理想的搜索是不经过比较,直接拿出数据,建立关键码和存储位置的关系。 哈希冲突的产生与解决不同的关键码通过相同的哈希函数计算出相同的地址,产生冲突。因此在设计哈希函数时,要尽量避免冲突,...原创 2018-06-26 15:22:45 · 1888 阅读 · 0 评论 -
排序算法总结
排序算法总结直观感受排序算法:https://www.cnblogs.com/onepixel/articles/7674659.html排序算法总结插入排序直接插入排序希尔排序选择排序直接选择排序堆排序交换排序冒泡快排归并排序插入排序直接插入排序思想是将待插入序列放入已经有序的序列,通过不断后移元素找到要插入的位置并放入。...原创 2018-05-31 17:41:34 · 734 阅读 · 0 评论 -
二叉搜索树探究
二叉搜索树探究完整代码:https://github.com/zzaiyuyu/BinarySearchTree二叉搜索树探究插入结点查找结点删除结点性能插入结点根据二叉搜索树的定义,左孩子&lt;根节点值&lt;右孩子。寻找需要插入的位置,不难发现最后的位置一定是NULL,而不会存在于两个结点中间。另外用parent指针记录待插位置的父节点。非递归:...原创 2018-05-15 10:42:14 · 360 阅读 · 0 评论 -
堆及其应用(优先级队列,TopK问题,堆排序)
堆创建插入元素删除元素优先级队列TopK问题堆排序完整代码:https://github.com/zzaiyuyu/Heap堆创建首先建立一个无序完全二叉树序列,然后自底向上调整每一个非叶结点。调整规则是将调整结点值变为比左右孩子结点都小(小根堆),若不满足,循环调整到树下层,称为向下调整。为什么从最后的非叶结点向前调整?因为每次调整起码要保证当前结点比左...原创 2018-05-15 10:41:42 · 464 阅读 · 0 评论 -
栈的相关面试题
栈的相关面试题完整代码:https://github.com/zzaiyuyu/InterviewOfStack实现一个栈,能在O(1)时间内返回栈最小值用一个额外的栈存放当前栈的最小值。push:当数据栈入元素时做一个判断,如果元素小于等于最小栈的栈顶元素,就给两个元素都入栈。pop:数据栈出元素时,若两个栈顶元素相等,则两个栈都出元素,否则只出数据栈。用两个栈实...原创 2018-05-07 17:36:32 · 407 阅读 · 0 评论 -
链式队列及相关操作
链式队列及相关操作完整代码:https://github.com/zzaiyuyu/Queuequeue.h#pragma once#define DataType inttypedef struct Node { DataType data; struct Node * next;}qNode;//基于带头结点的单链表队列typedef struct ...原创 2018-05-07 17:35:53 · 361 阅读 · 0 评论 -
有穷状态机思想——注释转换
有穷状态机思想——注释转换画状态转换图所谓自动机思想就是假设有一台机器,上面有状态指示灯,作用是通过传送带前后改变通过的物体。当状态灯保持时,货物按一定规则输出,当状态灯突变时,货物根据另一种规则输出。利用这种思想,可以将所有有穷的状态列出来,大大清晰了思路,只需要往每一个状态里填对应的处理函数。例如注释转换问题,把形如/**/的c风格注释转换为c++风格//注释。如图...原创 2018-05-18 22:57:18 · 3437 阅读 · 0 评论 -
链式二叉树——操作总结
链式二叉树——操作总结二叉树中反复使用递归思想,掌握寻找子问题的能力就能解决所有二叉树问题。非递归先序遍历需要用到数据结构栈,下文提供两种思路解决。层序遍历用到队列,也即广度遍历思想。完整代码github:https://github.com/zzaiyuyu/BinTree BinTree.h#pragma oncetypedef char BTDataType; ty...原创 2018-05-05 23:06:36 · 807 阅读 · 0 评论 -
活动选择问题——贪心算法与动态规划
最优子结构设Sij表示活动i开始时间后且活动j时间结束前的活动集,假设有一个最大兼容活动子集Aij,其中包括了活动k。由于最优解包含活动k,可以得到两个子问题:寻找Sik以及Skj中的兼容活动子集。原问题解变为:Aij = Aik ∪k ∪Akj。有了最优子结构,意味着可以用动态规划解。如果用c[i][j] 表示集合Sij的最优解的大小,则可得递归式: c[i][j] = ...原创 2018-05-05 16:51:07 · 1862 阅读 · 0 评论 -
链表c实现——附相关面试题
链表c实现——附相关面试题写链表全部需要注意的点typedef 把链表结点指针类型重命名,pNode是结构体指针类型在每一个方法里首先要处理非法数据,传入指针为空就可能造成崩溃删除结点相关的方法里,要提前保存要删除的结点,防止内存泄漏,防止野指针如果牵扯到可能改变头结点指向,就得传入二级指针pNode*,或者返回值为pNode写方法时首先考虑空链表,其次是一般情况,还要考虑只有头...原创 2018-04-16 09:34:00 · 495 阅读 · 0 评论 -
翻转单词顺序列——剑指offer
利用翻转函数,先对整串反转,再用pp和p两个指针判断单词的位置进行逐个反转。 细节处理要考虑串前面的空格,串中连续的多个空格,串的最后一个单词。string reverse(string str, int left, int right){ if (left<0 || right > str.length() - 1) { return ""; ...原创 2018-04-10 11:27:38 · 439 阅读 · 0 评论 -
二维数组中的查找——剑指offer
二分查找思想。 主要练习了vector的二维创建传参。bool Find(int target, vector<vector<int> > array) { int cols = array[0].size(); int rows = array.size(); int x = rows - 1; int y = 0; whil...原创 2018-03-30 20:46:48 · 563 阅读 · 2 评论 -
静态顺序表c语言实现
实现涉及到顺序表的增删改查排序。seqList.h#pragma oncetypedef int DataType;#define MAX_SIZE 10 typedef struct SeqList{ DataType _array[MAX_SIZE]; int _size; // 表示顺序表中有效元素的个数 }SeqList, *PSeqList;// ...原创 2018-04-07 22:12:09 · 375 阅读 · 0 评论 -
构建乘积数组——剑指offer
题目描述有问题,给出的A应该是{1,2,3,4,5}.而不是从0开始,给出的测试用例也是从一开始,这点很坑。 这道题就是考察边界条件的分析以及数组找规律。 B的每一行分为两部分计算,以对角线为分割,C为左上三角数组,D为右下三角数组,B = C * D;vector<int> multiply(const vector<int>& A) { in...原创 2018-03-30 19:08:34 · 397 阅读 · 0 评论 -
数组中重复的数字——剑指offer
简单的思路:创建一个length长度的变长数组,作为hash表,出现一次加一,最后遍历原数组找到第一个出现一次的。 练习了c语言动态内存开辟bool duplicate(int numbers[], int length, int* duplication) { if (duplication == NULL || numbers == NULL) { retur...原创 2018-03-30 15:00:24 · 292 阅读 · 0 评论 -
替换空格-——剑指offer
思路很清晰:正着拷字符串每次遇到空格都要把源串内容向后平移,时间复杂度较大,所以先预处理字符串,数出空格数。然后定义两个指针 pf = str + length ; pf = str + length + 2*空格数; 遇到空格pt换成%20,非空格原样复制。 *遇到的一个坑,循环终止条件是length+1次,因为有0也要拷一次。void replaceSpace(char *str,...原创 2018-03-30 14:07:20 · 306 阅读 · 0 评论 -
c语言递归练习习题
求第n个斐波那契数求n的k次方输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19递归实现字符串反转递归和非递归分别实现strlen递归求n的阶乘递归方式实现正序打印一个整数的每一位求第n个斐波那契数#define _CRT_SECURE_NO_WARNINGS#include <st...原创 2018-03-15 16:00:05 · 6521 阅读 · 5 评论 -
c语言字符串习题
反转字符串字符串左旋k位查找一个字符串中第一个只出现1(K)次的字符输出数字三角形一个正整数有可能可以被表示为 m(m>=2) 个连续正整数之和调整数组使奇数全部都位于偶数前面杨氏矩阵判断一个字符串是否为回文字符串判断一个数是否为回文数反转字符串#include <stdio.h>#include <string.h>#...原创 2018-02-26 17:29:29 · 9339 阅读 · 1 评论 -
c++递归和迭代创建二叉搜索树性能比较
二叉搜索树插入结点运行结果结果分析第一种算法用递归实现二叉树结点插入,思路简单,但是容易溢栈。 根据二叉查找树的定义,若插入节点的值若大于当前节点的值,则继续与当前节点的右子树的值进行比较;反之则继续与当前节点的左子树的值进行比较。第二种迭代法比较当前节点的值和插入节点的值,到了二叉树的最后一层时选择是链接至左子结点还是右子节点。两种算法的时间复杂度 二叉原创 2018-01-16 20:41:21 · 595 阅读 · 0 评论 -
c++递归二分查找和迭代二分查找性能比较
二分算法读取的数据文件两种二分算法的运行结果算法结果分析第一种二分是普通的迭代算法,在有序数组中查找键值,若小与中间值,则搜索范围变为左半边,若大于则搜索范围变为右半边,其中一直改变的都是下标 二分查找的基本思想是将n个元素分成大致相等的两部分,去a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止,如果xa[n/2],则只要在数组a的右半部搜索x.原创 2018-01-16 20:40:05 · 1115 阅读 · 0 评论 -
连续子数组的最大和——剑指offer
这道题解法很多,最经典的就是动态规划。 状态是数组下标i,状态对应的值是以i为终点的连续最大和,用一个DP数组记录每个状态的值。 原问题转化为求max(DP[0]……DP[i]), 为求DP[i]的值,需要解决的子问题是求出DP[0]……DP[i-1]。 原问题和子问题的关系也即———转移方程是: DP[i] = array[i] (DP[i-1]>0) || DP[i-1] ...原创 2018-03-31 21:58:15 · 381 阅读 · 0 评论 -
尾递归与斐波那契三种解法
常规的斐波那契数列解法int fib(int n) { if (n <= 2) { return 1; } else return fib(n - 1) + fib(n - 2);}要求第n个斐波那契数,子问题就是求每一个斐波那契数的前一项和前二项之和,典型的递归思想。这个算法的时间复杂度怎么算呢? 递归的时间...原创 2018-04-08 23:00:57 · 3040 阅读 · 0 评论 -
数组中只出现一次的数字——剑指offer
经典的利用异或的性质的题目。 按num1和num2的异或结果,找到二进制最低位不相同的位置,把数组分成两组,每组必然只包含其中一个出现一次的数。void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) { if (num1 == NULL && num2 == NULL) { ...原创 2018-04-10 09:37:15 · 308 阅读 · 0 评论 -
数字在排序数组中出现的次数——剑指offer
书上写的是递归法,个人更喜欢循环写二分查找。 这道题给的有序数组第一思路是二分查找k,然后向两侧扫描找到起点终点,但这样时间复杂度是O (n). 巧妙地思路是两次二分查找,第一次找first第一次出现的下标,只需要把二分查找条件变一下就好了,第二次找last,最后返回last - first +1. 这里的陷阱是如果数组里没有这个数,就会返回1,把first设为-1如果没找到返回0.in...原创 2018-04-10 09:20:11 · 584 阅读 · 0 评论 -
把数组排成最小的数(存疑)
若想组成最小串,就得把小的串排在前面,也就需要对源串进行排序。 排序的规则当然不能直接字符串比较,这样组合出来的数不一定是最小的,比如说 3 < 32 <321 组合出来332321,而321323才是最小的。 自定义比较的规则是:n和m串组合,nm或者mn。返回其中较小者。*结果数组越界,未解决const int g_maxLength = 10;static int ...原创 2018-04-02 21:55:55 · 395 阅读 · 0 评论 -
整数中1出现的次数——剑指offer
剑指offer上的递归解法确实难以理解且不是最佳解法,下面这个博客巧妙地找规律。 https://blog.csdn.net/yi_afly/article/details/52012593 思路是求出数字每一位出现1的次数,最后求和。 每一位出现的次数和前面后面的数字都有关系,和前面的关系是 必定出现了 当前位权重*前面的数字次 ,和后面的关系分三种情况 1. 当前位是0,也就是后面的不...原创 2018-04-02 16:50:09 · 405 阅读 · 0 评论