求逆序对
划分归并对数组进行调整的合理性在于
每次划分数组后,在前面数组的元素与后面数组元素相对次序不会颠覆,就是前面元素在前面划分出的数组里随便调整,也依然在后面数组的任意元素里的前面,而不可能调整到后面数组的任意元素里的后面,所以在调整时,即使影响,也只是会影响前面数组里的逆序对数,而不会影响前面数组里的某个元素和后面数组里任意元素组成逆序对
所以递归归并思路就是,先划分数组,目的就是最后返回出这两个前后数组里的元素所能组成的逆序对数,即只考虑的是两个数组之间组成的逆序对数,而没有考虑数组内元素组成的逆序对数
因为要不断递归,数组内的元素组成的对数在底层递归时已求解出,而且保证到上层时,每个数组都是处于已排好序的状态
找前后数组的逆序对数,就用两个指针指头元素,如果前数组的头元素比后元素大,就不断出后数组的元素,直到不再大于前元素;前元素的首个元素大于,那么前数组里的剩下所有元素都比后面的首个元素大,即前面的剩的数量*从开始小于,到后面首个比前面头元素大的之间的数量,最后终点就是其中一个取完
二分回顾
二分查找可以找到数组元素中的极大值或极小值,也可以找到有序数组中的特定值
找极小值
担心的是,如果中间元素的右边比中间元素小,就会使左指针右移到中指针处,但是如果最小元素是在左区间里,就会出问题
确实会出问题,所以二分的应用场景是有序的,由于是旋转数组,所以序列里至多存在两个有序列,只有相邻处无单调性
如果中指针比右指针大,只能说明右指针在小序列里,中指针在大序列里,最小值就在这俩区间内,让左指针右移到中指针处
如果中指针比右指针小,由于有序,说明中指针到右指针的区间内一直单调,即位于同一区间内,可能是大的也可能是小的,但最小值一定不在其中,但可能在左端点,所以让右指针左移到中指针,找另一半区间
如果中指针和右指针相等,可能的情况有两种;一种是小序列和大序列里都有这个元素,然后指针都指在这个元素上,这种情况下,最小数字在区间内;另一种是这俩相等元素之间就在一个序列里,那也不能确定这个元素是不是所要的最小元素
这里的策略就是让右指针往左移一位(因为右指针初始在最右侧),这样可以使下次的中指针发生变动,且是往左偏,如果是第一种情况,首先可以确定是大序列在前,小序列在后,那么中指针左移一下,由于两个序列都有这个元素,而且原序列是单调的,就说明大序列之前的元素都是这个元素,小序列之后的元素也都是这个元素。右指针在小序列里,中指针在大序列里,调整后中指针依然在大序列里,如果一直相同,就会使右指针不断左移,直到右指针在小序列里可能遇到第一个相异的元素,就会使中指针大于右指针
如果是后一种情况,中指针只可能在于小序列,如果中指针在大序列,那么说明左指针,右指针均在大序列里,则最小值只会在左端点;中指针位于小序列,右指针左移,会使中指针到大序列,就会使下一次中指针大于右指针