diff --git a/算法周更班/class_2022_11_1_week/Code03_HappyLimitLessGap.java b/算法周更班/class_2022_11_1_week/Code03_HappyLimitLessGap.java index e282f20..f978c8b 100644 --- a/算法周更班/class_2022_11_1_week/Code03_HappyLimitLessGap.java +++ b/算法周更班/class_2022_11_1_week/Code03_HappyLimitLessGap.java @@ -41,11 +41,11 @@ public class Code03_HappyLimitLessGap { // 二分答案 public static int lessGap2(int[] a, int[] b, long k) { int n = a.length; - // a : 20 30 17 - // b : 5 10 36 - // 0 1 2 - // [ 20, 5] [30, 10] [17, 36] - // 0 1 2 + // a : 20 30 17 + // b : 5 10 36 + // 0 1 2 + // [ 20, 5] [30, 10] [17, 36] + // 0 1 2 int[][] f = new int[n][2]; int min = b[0]; int max = b[0]; @@ -57,16 +57,16 @@ public class Code03_HappyLimitLessGap { } // 排序和大流程,没关系 // 是子函数,maxHappy函数,需要用到,排了序 - // 根据财富排序,少 -> 多 + // 根据财富排序,少 -> 多 Arrays.sort(f, (x, y) -> x[1] - y[1]); - // 隔阂值的范围 l ~ r + // 隔阂值的范围 l ~ r int l = 0; int r = max - min; int m = 0; int ans = -1; while (l <= r) { // 0.........50 - // 25 + // 25 m = (l + r) / 2; if (maxHappy(f, m) >= k) { ans = m; @@ -93,6 +93,29 @@ public class Code03_HappyLimitLessGap { return ans; } + // 正式方法 + // 排序 + 窗口 + public static int lessGap3(int[] a, int[] b, long k) { + int n = a.length; + int[][] f = new int[n][2]; + for (int i = 0; i < n; i++) { + f[i][0] = a[i]; + f[i][1] = b[i]; + } + Arrays.sort(f, (x, y) -> x[1] - y[1]); + int ans = Integer.MAX_VALUE; + for (int l = 0, r = 0, happy = 0; l < n; l++) { + while (r < n && happy < k) { + happy += f[r++][0]; + } + if (happy >= k) { + ans = Math.min(ans, f[r - 1][1] - f[l][1]); + } + happy -= f[l][0]; + } + return ans == Integer.MAX_VALUE ? -1 : ans; + } + // 为了验证 public static int[] randomArray(int n, int v) { int[] arr = new int[n]; @@ -115,7 +138,8 @@ public class Code03_HappyLimitLessGap { int k = (int) (Math.random() * n * V) + 1; int ans1 = lessGap1(a, b, k); int ans2 = lessGap2(a, b, k); - if (ans1 != ans2) { + int ans3 = lessGap3(a, b, k); + if (ans1 != ans2 || ans1 != ans3) { System.out.println("出错了!"); } }