大家好,我是晴天学长,今天的算法题思想用到了枚举二分,并遇到了查找不存在的情况,题目不难,但是知识的思路的运用还是值得学习的,需要的小伙伴请自取哦!💪💪💪
1 )递增三元组
2) .算法思路
- 枚举b数组的元素,用二分查找A和B。
- 因为A和B可能会查找不到的情况,所以的左闭右开法的r要-1,其他不变。
- 有不存在情况,所以要检测一道。
3).代码示例
package LanQiaoTest.二分;
import java.util.Arrays;
import java.util.Scanner;
public class 递增三元组 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split(" ");
int N = Integer.parseInt(s[0]);
int[] A = new int[N];
int[] B = new int[N];
int[] C = new int[N];
s = sc.nextLine().split(" ");
for (int i = 0; i < s.length; i++) {
A[i] = Integer.parseInt(s[i]);
}
s = sc.nextLine().split(" ");
for (int i = 0; i < s.length; i++) {
B[i] = Integer.parseInt(s[i]);
}
s = sc.nextLine().split(" ");
for (int i = 0; i < s.length; i++) {
C[i] = Integer.parseInt(s[i]);
}
Arrays.sort(A);
Arrays.sort(C);
long sum = 0;
for (int i = 0; i < B.length; i++) {
int b = B[i];
int t = check1(A, b);
int r = check2(C, b);
if ((A[t] < b) && (C[r] > b)){
sum += (long) (t + 1) * (C.length - r);
}
}
System.out.println(sum);
}
//A数组的二分
private static int check1(int[] nums, int k) {
int l = 0;
int r = nums.length - 1;//注意
while (l < r) {
int mid = (r - l) / 2 + l + 1;
if (nums[mid] < k) {
l = mid;
} else r = mid - 1;
}
return r;
}
//B数组的二分
private static int check2(int[] nums, int k) {
int l = 0;
int r = nums.length - 1;//注意
while (l < r) {
int mid = (r - l) / 2 + l;
if (nums[mid] > k) {
r = mid;
} else l = mid + 1;
}
return l;
}
}
4).总结
- 研究一个二分情况的二段性很重要。
- 有可能不存在的情况的时候,记得要检验一下。