- 博客(18)
- 收藏
- 关注
原创 贪心算法入门(455.860.134)
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。贪心算法一般按如下步骤进行: ①建立数学模型来描述问题。②把求解的问题分成若干个子问题。③对每个子问题求解,得到子问题的局部最优解。④把子问题的解局部最优解合成原来解问题的一个解。1.分发饼干解题思路要尽可能满足越多数量的孩子,
2022-06-12 20:08:29
190
1
原创 已知两种遍历序列构造二叉树
二叉树的前序遍历顺序是:先访问根节点,然后前序遍历左子树,再前序遍历右子树。中序遍历顺序是:中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树。后序遍历顺序是:后续遍历根节点的左子树,然后是后序遍历右子树,最后访问根节点。 【主要思路】1.通过前序遍历,得知根2.通过中序遍历,得知左子树的长度。3.就剩下右子树的未知的,就用递归构建【主要思路】1.关键是想清楚后序遍历如何表示左子树、右子树、根·前序遍历:根/左子树/右子树 -> 根在头·中序遍历:左子树/根/右子树 -> 左子树
2022-06-05 21:32:22
1759
原创 树-二叉搜索树
-树是什么树是计算机中非常重要的一种数据结构,它是由n(n>=1)个有限结点组成的一个具有层次关系的集合。这里只讨论由链表链接的树。树具有以下特点 1.每个结点有零个或多个子结点; 2.没有父结点的结点为根结点; 3.每一个非根结点只有一个父结点; 4.每个结点及其后代结点整体上可以看做是一棵树,称为当前结点的父结点的一个子树;-二叉树如果一个树的每个结点的子节点不超过两个,则可以说这个树是二叉树.如下图就是一个标准的二叉树。二叉树的中序遍历中序遍历:
2022-05-29 15:29:59
202
原创 二叉树前,中,后序遍历
-前言树是一种常用的数据结构,用来模拟具有树状结构性质的数据集合。树里的每一个节点(结构体)有一个值和一个包含所有子节点的列表。二叉树则是更典型的树结构,每个结点最多有两个子节点。接下来记录二叉树的三种遍历方法。-中序遍历什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。这里先讲中序排序,是因为中序排序与后序排序的迭代法思路较为类似,相对好理解一点,而前序遍历比较不同,放在最后说。- 以上
2022-05-25 22:41:09
340
原创 动态规划入门二(5.647.62)
一.最长回文子串1.构造数组dp[ len ][ len ],dp[ x ][ y ]表示字符串s从x到y这段字符是否是回文子串2.赋初值,i从0到 len - 1让dp[ i ][ i ]都为1,因为单个字符也属于回文子串。3.状态转移方程:从x到y这段字符串要是回文串的前提是s[ x ] == s[ y ],且x + 1到y - 1这段也得是回文串。因此有 dp[ x ][ y ] = (dp[x + 1][y - 1] && s[ x ] == s[ y ])。(y -
2022-05-23 16:46:54
106
原创 动态规划入门一,队列的bfs(70.121.279.200)
什么是动态规划动态规划就是利用历史数据避免重复计算,历史数据用一维数组或二维数组保存。利用动态规划解题最基本需要经历两个步骤:1.先定义数组并明确数组的意义,给数组赋初值,2.再找到各个元素之间联系(即动态转移方程)最后得出结果。例题接下来用三道例题入门动态规划。1.爬楼梯1.定义数组dp[ n ],dp[ n ]的值表示走到n阶有几种方法。2.赋初值,显然dp[ 1 ] = 1, dp[ 2 ] = 2.3.寻找元素间的联系(即动态转移方程),容易得出n...
2022-05-22 21:08:13
202
原创 设计循环队列
队列 队列是一种基本的数据结构,与后入先出的栈相反,队列具有先入先出的规则。其基本操作有入队,出队。 通过以下代码可以创建一个最简单的队列,存储int类型数据。#include <stdio.h>#include <stdlib.h>#define MAX 50//队列类型的定义 typedef struct{ ElemType data[MAX]; int front, rear;//front为队首指针 re...
2022-05-15 22:04:53
372
原创 双指针法解题记录
Leetcode.141-环形链表题目要求判断一个链表中是否有环这题采用快慢指针解答,构造fast指针与slow指针,slow指针每次前进一个节点,fast指针每次前进两个节点。fast指针走到NULL则说明链表中无环,两个指针相遇说明有环。注意对head以及head->next判空,以及fast指针的判空代码部分:bool hasCycle(struct ListNode *head) { if (head == NULL || head->next == N.
2022-05-08 20:52:27
663
原创 leetcode.937 重新排序日志文件
-题目char ** reorderLogFiles(char ** logs, int logsSize, int* returnSize){}-解题思路 把字母日志全部排在数字日志前,利用快排的性质,使用strcmp函数分别排列字母日志,数字日志。知识点- 解答这道问题,最好先熟悉以下四个函数: 1. 函数isdigit:功能 - 判断参数是否为数字,为数字返回非0,不为数字返回0。 头文件 - <ctype.h>...
2022-05-04 22:51:52
304
原创 3.20周记:栈和队列
栈-栈的定义栈也称堆栈,是一种先进后出,删除和插入都在栈顶操作的线性表。-栈的特性先进后出,后进先出。基本操作只有两个:出栈(push)和进栈(pop)-基本运算初始化栈、判断空、入栈、出栈、读栈顶元素。-栈种类栈分为顺序栈与链式栈两种:顺序栈类似线性表,是数组的形式;而链式栈类似链表,用指针链接每个部分。-顺序栈#include <stdio.h> #include <stdlib...
2022-03-20 21:27:55
1259
原创 哈希表(散列表)的介绍,代码实现
百度百科介绍的哈希表:哈希表(Hash table,也叫散列表):是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。背景 假设数组a中有n个数据,要从中查找整数key,最朴素的办法是通过循环遍历查找。但是这种方法通常效率很低,例如在查找1到10是否在数组a[n]中,总共需要执行10*n次,时间复杂度为O(n),而通过哈希...
2021-12-05 20:11:48
970
原创 判断回文链表(剑指offer.027)
目录 -数组法- -递归法--快慢指针--题目-/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */bool isPalindrome(struct ListNode* head) { }(注意:这题的条件为不带头结点的单链表,head就是链表的第一个结点)(这里boo...
2021-11-28 18:30:45
349
原创 双向链表 建立和插入
单链表有next指针,在查询下一个结点的时间复杂度为O(1),但在查询上一个结点时就会很麻烦,因为每次只能从头指针head开始遍历查找。双向链表就克服了这个缺点。双向链表定义:双向链表是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。所以双向链表的每个结点都有两个指针域,分别指向前后结点。双向链表特点: 1.每次在插入或删除某个节点时, 需要处理四个节点的引用, 而不是两个. 实现起来要困难些; 2.相对于单向链表, 必然占用内存空间更...
2021-11-21 20:33:08
2051
1
原创 链表的建立,搜索,插入,反转,销毁以及合并有序链表。
-创建,插入,反转链表-/*关于链表的一系列操作*/ #include <stdio.h>#include <stdlib.h>typedef struct node{ int data; struct node *next; }Node,*linklist;int main(){ //创建链表,赋值 (头插法) linklist head = (linklist)malloc(sizeof(Node));//head 头结点 linkli..
2021-11-20 13:34:17
669
原创 记录四个字符串函数
1.strlen函数:-头文件:string.h-格式:strlen(char *s)-作用:求一个数组的长度,直到遇到第一个‘\0’为止,不包括‘\0’-模仿函数:int mystrlen( char *a ){ int i=0; while( a[i]!= 0 ) { i++; } return i;}2.strcpy函数:-头文件:string.h-格式:strcpy(char *s1,char *s2)-作用:将字符数组s2复制给s1-.
2021-11-15 23:27:38
763
原创 简单分析算法的时间复杂度
目录一.什么是算法的时间复杂度二.如何分析一个算法的时间复杂度1.有确定次数的算法2.次数不确定的算法一.什么是算法的时间复杂度时间复杂度是一个函数 ,定性描述一个算法(程序)的运行时间。它可以是渐近的,亦即考察输入值大小趋近无穷时的情况。正常情况下,完成相同的任务的时间复杂度越低,算法越优。 比如 求从1到100的和的两种方法 的时间复杂度:int i,sum = 0, n = 100;for (i = 1; i <=n; i++...
2021-11-14 17:48:59
2472
原创 11.10错题集(7-函数)
目录7-1 递归实现顺序输出整数:7-2 递归求简单交错幂级数的部分和:7-3出生年:7-4近似求PI:7-1 递归实现顺序输出整数:-本题要求实现一个函数,对一个整数进行按位顺序输出。-本题要求实现一个函数,对一个整数进行按位顺序输出。-函数接口定义:void printdigits( int n );-函数printdigits应将n的每一位数字从高位到低位顺序打印出来,每位数字占一行。-裁判测试程序样例:#include <stdio.h&
2021-11-10 11:52:47
1004
原创 简单分析几个常见的排序算法(C语言)
swap(int *a,int *b){ int temp=*a; *a=*b; *b=temp;} (为方便阅读代码,每段代码前定义这个函数用来交换两个数。)1.冒泡排序: -冒泡排序的基本思想:两两比较相邻记录的关键字,若反序则交换,直到没有反序的记录为止。 ↓基本代码↓int main(){ int n...
2021-11-07 20:33:04
997
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人