数据结构与算法
无奈的角斗士
这个作者很懒,什么都没留下…
展开
-
遍历一次删除倒数第k个节点
如果遍历两遍链表,很容易就能想到方法,先遍历一边求出链表长度n,遍历第二遍时遍历到n-k位置删除n-k+1个节点现在是遍历一遍过程也很简单1.声明两个指针p、q,分别指向链表头结点,让p遍历到第k个节点处2.若p还没到k处就指向空,则链表长度不够,返回head3.p、q同时开始遍历链表直到p遍历到链表最后一个节点,这是q到达n-k个节点处,删除到q的下一个节点即可代码:N...原创 2018-10-22 21:36:05 · 1770 阅读 · 0 评论 -
快速幂
快速幂 一种快速求指数的方法一般求a^b的做法,就是将a循环相乘b次时间复杂度为O(b),即O(n),快速幂可以将时间复杂度将为O(logn)那它是如何做到的呢以b = 11 为例11 的 二进制 为 1011,即2^3*1+2^2*0+2^1*1+2^0*1,所以a^b = a^(2^3*1)*a^(2^2*0)*(2^1*1)*a*(2^0*1)①这里引入两个位操作符...原创 2018-11-27 11:58:36 · 149 阅读 · 0 评论 -
快速排序
1.思想设需要排序的数组下标p-r,选择p-r任意一个数据pivot(分区点),遍历p-r,将小于pivot的数据放左边,大于pivot的数据放右边,pivot放中间,进过这一步骤后,数组p-r,即被分为三个部分(p、q-1)小于pivot(q+1、r)大于pivot中间是pivot,根据分治、递归的思想,递归排序p-q-1、q+1-r的数据,直到区间缩小为1说明数据有序图解:递推...原创 2018-12-04 11:07:52 · 158 阅读 · 0 评论 -
排序(冒泡、插入、选择)
排序是算法研究中比较重要的一个部分,这里列举比较简单的三种排序算法的c++实现1.交换函数交换函数可以让代码看上去更加简洁tip:在面试的时候,要求手写代码时,将一些重复的代码写成函数,还以为你的代码加分哦//交换数据void swap(int& a ,int& b){ int temp = a; a = b; b = temp;}2.冒泡排序...原创 2018-11-29 11:25:38 · 159 阅读 · 0 评论 -
二分法求平方根
1.问题利用二分法求一个数的平方根,精度要求 e < 10^-6;2.思路1.要求x(x>0)的完全平方根,则二分法范围为[low,up] 其中 low = 0, up = x2.令mid = (up+low)/23.以fabs(mid * mid - x) >=1e-6为循环条件3.1若满足条件,令mid = (up+low)/2,判断mid*mid与...原创 2018-11-22 16:27:15 · 14473 阅读 · 1 评论 -
二分法及其变体问题
1.寻找一个元素在数组中的位置//二分查找int midfind1(int lo,int hi,int tar) { int mid; while (lo <= hi) { mid = lo + (hi - lo) / 2; if (a[mid] > tar) hi = mid - 1; else if (a[mid] < tar) lo = mid +...原创 2018-11-23 17:03:29 · 410 阅读 · 0 评论 -
不带括号的表达式计算
一、表达式形式2*3+6/3+5二、问题假设一中的表达式是一段程序可读的字符串,如何计算表达式的值三、思路1.创建两个栈,分别为数字栈、和运算符栈2.遍历字符串3.当遇到数字将数字存储到数字栈中4.当遇到运算符时,比较运算符栈顶元素和当前运算符的优先级4.1若当前元素大于栈顶元素,将当前元素压入运算符栈4.2若当前元素小于等于栈顶元素,将栈顶元素弹出4....原创 2018-11-16 17:40:59 · 1648 阅读 · 2 评论 -
带括号的表达式计算
一、表达式形式形如(3*(2+5)),每个运算符之间都有括号相隔二、问题假设一中的表达式是一段程序可读的字符串,如何计算表达式的值三、思路1.创建两个栈,分别为数字栈、和运算符栈2.遍历字符串2.1遍历遇到‘(’不处理2.2遍历到数字,将数字储存到数字栈中2.3遍历到运算符,将运算符储存到运算符栈中2.4遍历到‘)’,从数字栈中取出两个数,从运算符中取出栈顶...原创 2018-11-16 14:41:20 · 4152 阅读 · 0 评论 -
单链表关于环的几个问题
问题:1.单链表是否有环2.环的节点长度3.环的入口节点4.表头到环入口的节点长度问题1.思路:在表头设置fast、slow指针,fast一次遍历两个节点,slow一次遍历一个节点,若相遇则证明有环,反之则不存在环代码:/** *引入快慢指针,若指针相遇则证明链表有环 */Node * findRing(Node *head) { Node * fast...原创 2018-11-08 14:09:17 · 181 阅读 · 0 评论 -
括号匹配(栈)
问题:利用程序判断字符串中的括号是否匹配[()],左右括号出现在对应位置则匹配,反之则不匹配思路:利用栈后进先出的特点0.从左自右遍历字符串1.遇到左括号时,将左括号压入栈中2.遇到右括号时,先判断栈是否为空,2.1若为空,则括号不匹配,右括号过多2.2若不为空,判断栈顶元素是否和左括号匹配3.当字符串遍历结束时,判断栈是否为空3.1若为空,则括号匹配...原创 2018-11-05 11:58:54 · 393 阅读 · 0 评论 -
合并有序链表
对这个问题想法其实很直接1.p和q分别指向两个有序链表的头指针2.缓存其中一个头指针nhead,并用指针h指向它2.p和q分别开始遍历链表,并比较每次链表存放的数据3.如果p指向的数据较小,把p指向的节点连接到h节点的后面,h节点向后移一位,q节点向后移一位4.如果q指向的数据较小,重复上述操作,操作对象为q指针5.重复上述操作,若其中遍历结束,那遍历剩下的链表代码:...原创 2018-10-23 16:48:49 · 209 阅读 · 0 评论 -
链表反转
原贴:https://blog.csdn.net/blioo/article/details/62050967反转过程:1.创建链表2.指针p保存第一个有数据的节点,将头节点和链表断开,用空指针q做反转后的最后一个节点3. 让第二个元素节点的指针从指向第三个元素节点变为指向第一个元素节点,以此类推,直至指针p指向原链表最后一个元素。 4.p指针指向NULL时,...原创 2018-10-21 16:52:41 · 171 阅读 · 0 评论 -
创建链表
1.头插法新元素从头部插入Node * head_initList() //头插法创建链表{ Node * head = new Node; //创建头指针 Node *s;//临时指针,指向新的节点 int n; while (cin >> n&&n != -1) { s = new Node; s->data = n; s-...原创 2018-10-21 16:07:48 · 580 阅读 · 0 评论 -
单链表操作
1.创建链表2.链表反转3.删除链表的倒数第k个元素4.返回链表的中间节点5.合并两个有序链表6.单链表关于环的几个问题关于链表操作有几个特别好的帖子讲解比较细:https://segmentfault.com/a/1190000008453411画的图不错:https://blog.csdn.net/qq_34992845/article/details/5394...原创 2018-10-23 21:14:22 · 152 阅读 · 0 评论 -
找到链表的中间节点
问题和删除倒数第k个节点类似,如果两次遍历很容易得到结果这里可以使用快慢指针的方法p每次遍历两个节点,q每次遍历一个节点当p或者p的下一个节点为空时,q指向链表的中间节点代码:int midList(Node * head) {//快慢指针 Node * fast = head; Node * slow = head; while (fast&&fast...原创 2018-10-22 21:47:00 · 764 阅读 · 0 评论 -
归并排序
归并排序1.思想将一个需要排序的数组分为(递归的)两半分别排序,然后将结果归并起来2.实现过程归并排序的过程是一个分治递归的过程写递归一个步骤1.写出递推表达式和终止条件2.实现递推代码os:是不是很简单,才怪!!!归并排序的递推式递推公式:merge_sort(lo…hi) = merge(merge_sort(lo…mid), merge_sor...原创 2018-12-03 14:43:53 · 170 阅读 · 0 评论