数组中比左边元素都大同时比右边元素都小的元素

220 阅读1分钟

题目

求数组中比左边元素都大同时比右边元素都小的元素,返回这些元素的索引。要求时间复杂度 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)));
}