答案一定位于:空桶左边的最大值和右边桶的最小值的差值
优化:桶内只保留最大值和最小值
2.
对于i位置,最优划分意味着一定是离i最近的能实现xor等于0的位置进行划分,假设划分k到i,若k不是最近的,中间还存在一个L,那么k到L和L到i可以形成两个划分。
3.
题目有误,是求第k大的数字
法1:双指针
法2:不断二分
法3(最优解):
核心思想是每次比较两个数组的中位数,来确定完全排序后中间位置数字的大概位置
假设两个数组长度分别是10和17,根据k可以分三种情况:
-
k<短的数组长度时,答案位于两个数组的前k个数字中
-
k介于两个数组中间时,答案取决于短数组是否全部小于长数组
-
如果为情况3,比如k=23,则A只可能是后5个,B也只可能是后5个:
求第k大的数字的代码:
-
shorts[kth-l - 1]>=longs[l-1]代表longs中的所有数字在shorts可能是第k大的数字前面。
-
getUpMedian是求两个数组的上中位数。当kth<s时,第k大的数只可能出现在短数组或长数组的前k个数里面,因此求前k个数的上中位数就行了。求上中位数的方法是通过确定两个数组的中位数进行优化的
- 算法思路(约瑟夫环)
i是长度,S是被杀节点位置
由于S=(m-1)%i+1,得:
对于某个节点,长度为i时序号为x,返回其在长度为i-1时的序号
- 原题