从今天开始,本菜鸟要开始为找工作面试做准备了。目前的计划是每天leetcode刷一道题+掌握一个java知识点。
今日知识点:分布式系统中的负载均衡算法
https://www.open-open.com/lib/view/open1446377378148.html
1.轮询。其实就是对每一个节点进行序号标记,然后将请求依次发出去。这适用于各个节点提供服务能力相同,而且忽略其当前状态。在实际业务中,往往存在更加复杂的情况。所以我们可以使用加权轮询。
2.随机。这个顾名思义就是随机发请求。和轮询很类似,我们也可以使用加权随机。
3.最小响应时间。如果一个服务器很忙,那么我们请求过去肯定会花很多时间。所以记录每次花费的响应时间,选择平均时间最小的进行请求就可以找到在偷懒的服务器。
4.最小并发数。这个也很直观,找到当前并发数最小的服务器,发给它处理就行。
5.哈希。这个是对当前服务器的状态进行哈希计算,得出最适合发送的服务器。这个很复杂,用什么哈希环等。如果问到一次就回来补充下。
今日算法题:给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
如果不存在满足条件的子数组,则返回 0 。
解法:容易想到,双指针left,right从左往右,每次让right+1.如果发现当前的滑窗不满足就让left+1. 但是问题在于,当我新增数字进入滑窗的时候,判断当前滑窗的最大值或者最小值是容易的。但是当我删掉左边的数字的时候,很难保留下当前滑窗的最大最小值。
题解做法是,使用单调队列。相当于把当前队列的最大值、最小值都能够直观的看出来。一旦发现左边将要被删除的数是队列的最大值或者最小值,就把它弹出。可以证明这两个队列一定不会是空的,因为至少每次都会把当前的right对应的数值加进去,所以最坏情况就是两个队列都只剩下一个数字,也就是当前数字,这样的话就肯定不需要进行弹出操作。
主要还是继续掌握一些单调队列,可以直接存值,也可以存index。