题解 | #数组单调和(小和问题)#

数组单调和

http://www.nowcoder.com/questionTerminal/8397609ba7054da382c4599d42e494f3

问题转化:求单调和(小和)就是统计该元素前有多少小于等于该数的元素之和。问题和归并两个有序数组求小于等于该数的元素之和一样。所以现在的问题变为统计子问题中单调和。

        // 当出现nums[i]<=nums[j]时,统计所有前半段区间内比nums[j]小的数
        // 当前一个数组元素小于或等于后一个数组元素时,累加小和
        // s[i] <= s[j] -> s[i] <= s[j]...s[right]
		while (p1 <= mid && p2 <= right) {
            if (a[p1] <= a[p2]){
                //当出现nums[i]<=nums[j]时,统计所有前半段区间内比nums[j]小的数
                // 当前一个数组元素小于或等于后一个数组元素时,累加小和
                // s[i] <= s[j] -> s[i] <= s[j]...s[right]
                res += a[p1] * (right - p2 + 1);
                temp[k++] = a[p1++];               
            } else{
                temp[k++] = a[p2++];
            }               
        }
全部评论

相关推荐

未知的命运:大佬这都找不到我还找啥啊
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务