
华为OD机试 双机位C卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。
一、题目描述
一线运维人员在对通话流量进行监控,每一段时间内都是出现流量的高峰,流量有高有低形成一个个波峰波谷,运维人员想找到流量变化最快的波峰,你可以帮助他吗?
给定一个整数数组nums,代表采样点的流量值,请找到满足以下条件的三元组 (i,j,k): 其中i<j<k,nums[j] > nums[i]且nums[j] > nums[k](即是峰顶),并找到所有满足条件的三元组中(k-i)的最小值
二、输入描述
第一行是一个整数n,表示有几个元素
第一行为n个整数,表示数组中的n个元素,0<= n < =100000
三、输出描述
返回所有满足条件的三元组中(k-i)的最小值。若不存在,返回-1。
四、测试用例
测试用例1:
1、输入
6
3 5 4 7 2 1
2、输出
2
3、说明
满足条件的三元组为[0, 1, 2],距离2
测试用例2:
1、输入
4
4 3 2 1
2、输出
-1
3、说明
无法找到满足条件的三元组,返回-1
五、解题思路
目标是最小化 k-i,且存在峰顶 j:i<j<k、nums[j] > nums[i] 且 nums[j] > nums[k]。
对固定峰顶 j,k-i = (j-i)+(k-j),左右两侧距离互不影响,因此应选离 j 最近的左侧严格更小元素与离 j 最近的右侧严格更小元素。
使用单调递增栈分别求每个位置的“最近左侧严格更小”和“最近右侧严格更小”,时间 O(n),空间 O(n),适合 n≤100000。
六、Java算法源码
public class OdTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.valueOf(sc.nextLine());
if (n < 3) {
System.out.print(-1);
return;
}
String[] arr = sc.nextLine().split(" ");
int[] nums = new int[n];
for (int i = 0; i < arr.length; i++) {
nums[i] = Integer.parseInt(arr[i]);
}
int[] leftLess = new int[n]; // 每个位置左侧最近严格更小的索引
int[] rightLess = new int[n]; // 每个位置右侧最近严格更小的索引
Arrays.fill(leftLess, -1);
Arrays.fill(rightLess, -1);
// 单调递增栈:栈中索引对应的值严格递增
int[] stack = new int[n];
int top = -1;
// 求左侧最近严格更小
for (int i = 0; i < n; i++) {
// 弹出所有 >= 当前值的索引,保证栈顶严格更小
while (top >= 0 && nums[stack[top]] >= nums[i]) {
top--;
}
leftLess[i] = (top >= 0) ? stack[top] : -1;
stack[++top] = i;
}
// 求右侧最近严格更小(从右向左)
top = -1;
for (int i = n - 1; i >= 0; i--) {
while (top >= 0 && nums[stack[top]] >= nums[i]) {
top--;
}
rightLess[i] = (top >= 0) ? stack[top] : -1;
stack[++top] = i;
}
int ans = Integer.MAX_VALUE;
for (int j = 0; j < n; j++) {
if (leftLess[j] != -1 && rightLess[j] != -1) {
ans = Math.min(ans, rightLess[j] - leftLess[j]);
}
}
System.out.print(ans == Integer.MAX_VALUE ? -1 : ans);
}
}
七、效果展示
1、输入
5
5 1 4 3 2
2、输出
2
3、说明
峰顶 4 的最近左小是 1,最近右小是 3,距离 2。

🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 双机位C卷 200分)
🏆本专栏收录于《华为OD机试(JAVA)真题》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

259

被折叠的 条评论
为什么被折叠?



