专题探究:极差
极差的性质,这种东西没有必要讲,毕竟只要善于分析就 ok 了;我们要讨论的主要是解题思路。
极差,最大的特点在于两端不确定性,即最大值与最小值需要同时确定。
由此,我们推想出一种思路:一端枚举,一端加速(如二分等技巧)。当然,还有一种非常重要的思想:双指针,这也就是锻炼思维能力的关键。
来看例题,只有实践才最有意义
小题狂做
小 z 遇到了几道有关极差的算法设计题,请你帮他完成:
给定一个长为 n n n 的数组,现在要把它分为 k k k 段,使得每一段里极差的最大值尽可能小,问最小值为多少。
给出一个长度为 n n n 的严格单调增的序列,将其分成 k k k 段,使得每一段的极差的和最小,求这个最小的和。(每段长度至少为1,当长度为1时,其极差为0)
给定一个长为 n n n 的数组 a a a,你可以进行至多 m m m 次操作,每次操作可以选定数组里的一个下标,若为数组中的最大值则变为数组中的最小值;若为数组中的最小值则变为数组中的最大值;否则不能操作。问经过操作后,数组极差最小是多少。
解法:
-
选择的数越多,极差必然会越大。最大值最小问题,满足二分性质,直接做即可。
-
简单思维题:如果不分段,极差为 a n − a 1 a_n-a_1 an−a1 ;分开一次,极差和为 a n − a i + a i − 1 − a 1 a_n-a_i+a_{i-1}-a_1 an−ai+ai−1−a1,也就是最初的极差减去了中间相邻两项差。直接做即可。
-
先把元素排好序,然后双指针:确定好最小值与最大值后,可以知道最小需要花费的操作次数:设小于最终最小值的数有 x x x 个,大于最终最大值的数有 y y y 个,那么最少操作次数为 x + y + min ( x , y ) x+y+\min(x,y) x+y+min(x,y) 次。
最小区间
给定一个长为 n n n 的数组 a a a,求出其中的一个区间,使得 “极差减去区间长度” 最大( m a x − m i n − l e n max-min-len max−min−len)。
即:你有一个长度为 n n n 的序列 a a a,它的一个区间 [ l , r ] [l,r] [l,r] 的价值是
max { a l , a l + 1 , ⋯ , a r } − min { a l , a l + 1 , ⋯ , a r } − r + l − 1 \max\{a_l,a_{l+1},\cdots,a_r\}-\min\{a_l,a_{l+1},\cdots,a_r\}-r+l-1 max{ a