题目
求数组中比左边元素都大同时比右边元素都小的元素,返回这些元素的索引。要求时间复杂度 O(N)
输入:[2, 3, 1, 8, 9, 20, 12]
输出:3, 4
解释:数组中 8, 9 满足题目要求,他们的索引分别是 3、4
代码
// 左边小右边大
public static Integer[] find(int[] nums) {
int length = nums.length;
// leftMax[i] 表示nums中[0, i-1]最大的元素
int[] leftMax = new int[length];
// rightMin[i] 表示nums中[i+1, length-1]最小的元素
int[] rightMin = new int[length];
leftMax[0] = Integer.MIN_VALUE;
rightMin[length-1] = Integer.MAX_VALUE;
for (int i = 1; i < length; i++) {
leftMax[i] = Math.max(leftMax[i-1], nums[i-1]);
}
for (int i = length-2; i >= 0; i--) {
rightMin[i] = Math.min(rightMin[i+1], nums[i+1]);
}
List<Integer> list = new LinkedList<>();
for (int i = 0; i < length; i++) {
if (leftMax[i] < nums[i] && nums[i] < rightMin[i]) {
list.add(i);
}
}
return list.toArray(new Integer[0]);
}
public static void main(String[] args) {
int[] nums = new int[] {2, 3, 1, 8, 9, 20, 12};
System.out.println(Arrays.toString(find(nums)));
}