随笔分类 -  算法随笔

记录算法学习过程中的笔记、想法、题目
摘要:和整数二分不同,浮点数不存在由于(整数)取整导致的边界问题,每次二分区间严格减半, 因此比整数二分简单的多,每次更新边界时直接让r = mid或l = mid即可。 看一道题,acwing790.数的三次方根 浮点数二分除了更新区间和浮点数不同,还有就是二分终止条件,一般有两种写法,一种就是当前区间 阅读全文
posted @ 2020-08-11 16:55 machine_gun_lin 阅读(450) 评论(0) 推荐(0)
摘要:整数二分有两个模板。 int bsearch_1(int l, int r) { while(l < r) { int mid = l + 1 >> 1; if(check(mid)) r = mid; else l = mid + 1; } return l; } 这种写法每次把区间压缩到**[l 阅读全文
posted @ 2020-08-11 16:45 machine_gun_lin 阅读(183) 评论(0) 推荐(0)
摘要:原题链接:acwing787.归并排序 归并排序和快速排序类似,都是基于分治的,步骤如下: (1)确定待排序数组的分界点mid, 一般取mid为待排序数组的中位数 mid = l + r >> 1; (2)递归排序分界点的左右两侧区间,直到区间大小为1; (3)归并两个排好序的区间,把两个有序的数组 阅读全文
posted @ 2020-08-11 14:28 machine_gun_lin 阅读(104) 评论(0) 推荐(0)
摘要:原题链接:acwing786.第k个数 一道快速排序的模板题,关于快速排序的原理和模板,可以参考[模板]快速排序 这里直接贴代码吧,和模板没什么区别,就输出排序后的第k个数而已。 #include<iostream> using namespace std; const int N = 1e6 + 阅读全文
posted @ 2020-08-11 11:35 machine_gun_lin 阅读(408) 评论(0) 推荐(0)
摘要:原题链接:acwing785.快速排序 给定数组大小n和数组q[n],对数组进行排序。 快速排序的原理:基于分治 (1)确定分界点x:可以取x为q[l], q[l + r >> 1],q[r], 或者数组中间随机一个值(建议取q[l + r >> 1], 原因在后面说)。这里l和r是当前待排序数组的 阅读全文
posted @ 2020-08-11 11:20 machine_gun_lin 阅读(170) 评论(0) 推荐(0)
摘要:原题链接 这道题就是单调栈最经典的应用,单调栈往往就是求一个数组中每个元素左边(之前)的元素中离它最近的比它小的元素。 首先很容易想到暴力做法,对于每一个元素,从当前元素的前一个元素开始往前遍历,第一个满足小于当前元素的元素就是答案,遍历完数组都不存在元素比当前元素小,则输出-1. 代码如下: #i 阅读全文
posted @ 2020-07-16 19:54 machine_gun_lin 阅读(114) 评论(0) 推荐(0)
摘要:原题链接 数组模拟队列和数组模拟栈其实很类似,都是用一个数组来存储元素,用指针表示当前可以操作的位置。 区别就是栈只能在栈顶进行操作,所以只需要有一个top指针指向栈顶。 而队列可以在队头和队尾都进行操作(出队、入队),所以需要两个指针head和tail指向队头和队尾。 如果有元素入队,则tail加 阅读全文
posted @ 2020-07-16 13:38 machine_gun_lin 阅读(164) 评论(0) 推荐(0)
摘要:原题链接 题意是用数组模拟一个栈,支持四种栈操作:在栈顶插入元素,弹出栈顶元素,查询栈顶元素,查询栈是否为空。 用数组模拟栈只需要开一个数组存储栈元素,再用一个额外的变量top表示当前栈顶元素下标。 直接看代码吧: #include<bits/stdc++.h> using namespace st 阅读全文
posted @ 2020-07-16 13:25 machine_gun_lin 阅读(178) 评论(0) 推荐(0)
摘要:之前写了数组实现单链表,提到了数组实现链表比指针实现最大的优点就是快,可以随机存取,而且不用new节点。 在图论的题目里用到邻接表,往往都是用数组实现。 数组实现双链表比单链表就多了一些对于左指针的操作。 为了实现的方便,不像在单链表实现里用一个额外的变量head去记录链表的头节点。 而是直接用两个 阅读全文
posted @ 2020-07-16 13:11 machine_gun_lin 阅读(480) 评论(1) 推荐(0)
摘要:单链表常见的实现方法有两种,一种方式是定义一个结构体表示链表节点。比如: struct node{ int val; node* next; }; 然后就是通过next指针将链表的所有节点连接起来。如果涉及到链表节点的插入和删除操作,则只需要修改链表节点的指针即可。 这种方式有个明显的缺点,就是不能 阅读全文
posted @ 2020-07-15 20:33 machine_gun_lin 阅读(2131) 评论(0) 推荐(1)
摘要:原题链接 来源:剑指offer, Hulu面试题 题意很简单。给定一个单链表,反转这个单链表,返回翻转后的头节点。 方法一 借助栈的性质 要将链表翻转,很容易想到借助栈的后进先出的性质来改变链表的顺序。 将链表节点顺序压入栈中,链表节点全部进栈以后,取栈顶元素作为新链表的头节点,然后将元素不断出栈, 阅读全文
posted @ 2020-07-10 11:09 machine_gun_lin 阅读(129) 评论(0) 推荐(0)