题目
给定一个数组,计算每个数的右边有多少个数的2倍,依然小于当前数。一共有多少个数
例如:arr = {1, 12,3,9,6,5,2}
res = 6
分别是
i = 12 有 3、6、5、2
i = 9 有 2
i = 5 有 2
解析
思路和前面的两道题差不多,因为需要对比当前数和右边数的大小,那么暴力解法是遍历,当时暴力解法的时间复杂度比较高,所以需要寻找更优的解法。因为前面两道题是需要对比左边的数,和当前的题目基本思路一致,所以可以使用归并排序的方式对数组进行排序,并在排序的过程对比数据的大小并记录结果。
但是本题并不是对比相邻的数即可,而是需要对比右边的每一个数,利用归并排序好的数组,可以通过窗口直接计算结果,无需对比每一个数,减少时间复杂度,相当于将右边数组作为一个窗口,每个计算当前数的最大位置,然后直接计算窗口中符合条件的大小即可
代码实现
public static int biggerTwice(int[] arr) {
if(arr == null || arr.length == 0) {
return 0;
}
return process(arr, 0, arr.length - 1);
}
private static int process(int[