手撕 part1
1、宏定义三个数最大值
挺有意思
max((a), (b), (c)) (a) > (b)? ((a) > (c)? (a) : (c)) ((b) > (c)? (b) : (c))
2、排序算法稳定性
什么是稳定? 稳定指:相同大小的值,经过排序后相对位置不变。
不稳定的常见排序算法:“快些选队”(快速排序,希尔排序,选择排序,堆排序)。
堆排序为什么不稳定?自己举例子。
3、基数排序
void count_sort(int num[], int n, int fac){
int cnt[10] = {0};
int* temp = new int[n + 1];
for(int i = 0; i < n; i++) cnt[num[i] / fac % 10]++;
for(int i = 1; i < 10; i++) cnt[i] += cnt[i - 1];
for(int i = n - 1; i >= 0; i--){
temp[cnt[num[i] / fac % 10] - 1] = num[i];
cnt[num[i] / fac % 10]--;
}
for(int i = 0; i < n; i++) num[i] = temp[i];
delete[] temp;
}
void radix_sort(int num[], int n){
int Max = num[0];
for(int i = 0; i < n; i++) Max = max(Max, num[i]);
for(int i = 1; Max / i; i *= 10){
count_sort(num, n, i);
}
}
4、链表相关
判断链表有环:
空间复杂度O(1)的解法:快慢指针。
快指针每次走2步,慢指针每次走1步,当他们第一次相遇时,说明有环。
证明:
假设环大小R,当慢指针到环入口时,快慢指针相距S。不妨设t时间后两者相遇,则必须有S+2t=t+nR。化简可得S+t=nR,因为S<R,所以必有解t=R-S。故假设成立,快慢指针可行。
链表环入口:
快指针每次走2步,慢指针每次走1步,当他们第一次相遇后,设置两个慢指针,一个从相遇点开始,一个重新从点开始,再次相遇就是入口。
证明:
假设环大小R,起点到入口长度L,入口到相遇点S,那么可得2(L+S)=L+S+nR,简化得L+S=nR。所以L=nR-S,nR-S可以看成从相遇点开始走n圈然后回退S步走到入口,L为从起点走到入口,那么显然在入口相遇。
找到链表中点:
空间复杂度O(1)的解法:快慢指针。
快指针每次走2步,慢指针每次走1步。快指针走到末尾时,慢指针在中间。
5、二进制数1
暴力、lowbit
参考资料
每天一道LeetCode-----判断链表是否有环,如果有,找到环的入口位置
手撕 part1的更多相关文章
- Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上
前言 诞生及优势 MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道.目标 ...
- 手撕RPC框架
手撕RPC 使用Netty+Zookeeper+Spring实现简易的RPC框架.阅读本文需要有一些Netty使用基础. 服务信息在网络传输,需要讲服务类进行序列化,服务端使用Spring作为容器.服 ...
- NN入门,手把手教你用Numpy手撕NN(一)
前言 这是一篇包含极少数学推导的NN入门文章 大概从今年4月份起就想着学一学NN,但是无奈平时时间不多,而且空闲时间都拿去做比赛或是看动漫去了,所以一拖再拖,直到这8月份才正式开始NN的学习. 这篇文 ...
- NN入门,手把手教你用Numpy手撕NN(2)
这是一篇包含较少数学推导的NN入门文章 上篇文章中简单介绍了如何手撕一个NN,但其中仍有可以改进的地方,将在这篇文章中进行完善. 误差反向传播 之前的NN计算梯度是利用数值微分法,虽容易实现,但是计算 ...
- 手撕公司SSO登陆原理
Single Sign-on SSO是老生常谈的话题了,但部分同学对SSO可能掌握的也是云里雾里,一知半解.本次手撕公司的SSO登陆原理,试图以一种简单,流畅的形式为你提供 有用的SSO登陆原理. 按 ...
- NN入门,手把手教你用Numpy手撕NN(三)
NN入门,手把手教你用Numpy手撕NN(3) 这是一篇包含极少数学的CNN入门文章 上篇文章中简单介绍了NN的反向传播,并利用反向传播实现了一个简单的NN,在这篇文章中将介绍一下CNN. CNN C ...
- 手撕代码:统计1到n二进制数中1出现的总次数
题目描述: 互娱手撕代码题. 统计从1到n这n个数的二进制表示中1出现的次数. 思路分析: 思路一:直接的做法是从1遍历到n,对于每个数和1做与操作,之后,对于这个数不断做右移操作,不断和1做与操作, ...
- 手撕ES6--Promise
手撕ES6--Promise:https://www.jianshu.com/p/0925eae38d2c 手写一个Promise,附源码分析:https://blog.csdn.net/weixin ...
- 编译原理--05 用C++手撕PL/0
前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 05 用C++手撕PL/0 在之前 ...
随机推荐
- 笔记 | pandas之时间序列学习随笔1
1. 时间序列自动生成 ts = pd.Series(np.arange(1, 901), index=pd.date_range('2010-1-1', periods=900)) 最终生成了从20 ...
- linux设备文件
一.前言 在调用了alloc_chrdev_region函数或register_chrdev_region函数之后可以在/proc/devices中看到该设备的主设备号,比如我注册的hello模块的主 ...
- 十九、更改LCD显示屏
一.裸机修改 之前测试用的屏幕是480*272的分辨率,现在要换成800*480的屏,因此要对软件代码进行修改. 对于裸机驱动而言,主要有两个点需要注意,一个是屏幕分辨率变了,因此初始化的时候与屏幕分 ...
- C语言中二维数组声明时,探究省略第一维的原因
我们在使用二维数组作为参数时,我们既可以指明这个数组各个维度的维数,同时我们也可以省略一维,但是二维却不能省略.why呢?由于编译器原理的限制,在一个数组Elemtype test[m][n]中,访问 ...
- Linux网络数据包的揭秘以及常见的调优方式总结
https://mp.weixin.qq.com/s/boRWlx1R7TX0NLuI2sZBfQ 作为业务 SRE,我们所运维的业务,常常以 Linux+TCP/UDP daemon 的形式对外提供 ...
- 排查golang的性能问题 go pprof 实践
小结: 1.内存消耗分析 list peek 定位到函数 https://mp.weixin.qq.com/s/_LovnIqJYAuDpTm2QmUgrA 使用pprof和go-torch排查 ...
- 签名 sign key 纸质邮件 历史 RSA诞生历史
API接口签名校验,如何安全保存appsecret? - 知乎 https://www.zhihu.com/question/40855191 要保证一般的客户端-服务器通信安全,可以使用3个密钥. ...
- Prometheus+Grafana监控SpringBoot
Prometheus+Grafana监控SpringBoot 一.Prometheus监控SpringBoot 1.1 pom.xml添加依赖 1.2 修改application.yml配置文件 1. ...
- Centos7安装成功后,网卡配置及更改镜像地址为国内镜像
Centos7安装成功后,网卡配置及更改镜像地址为国内镜像 一.网卡配置 二.修改网络配置 踩坑一:IPADDR 踩坑二:网关,DNS与本地不一致 重启网络服务 三.镜像修改为aliyun 四.相关知 ...
- Spark运行程序异常信息: org.apache.spark.SparkException: Task not serializable 解决办法
错误信息: 17/05/20 18:51:39 ERROR JobScheduler: Error running job streaming job 1495277499000 ms.0 org.a ...