数组中找到左侧比他小右侧比他大的数
2019-01-04 本文已影响11人
西5d
问题如标题,数组中找到左侧比他小右侧比他大的数,无序数组,要求时间复杂度在O(n)
。思路是单独创建一个标记数组,先从左往右遍历(i=0开始),找最大,如果是当前的最大,max标记位置和当前游标有max=i
,则设置标记数组位置+1;同理,从len-1
的位置,找最小,即从右往左遍历(i=len-1
开始),找最小,如果是当前的最小,min标记位置和当前游标min=i
,并把标记数组位置+1;最终标记数组中如果既是比左侧大的数又是比右侧小的数的值为2,用标记数组过滤一次原数组就可以得到。时间复杂度为3n
,空间为n
。
如下是代码:
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,9,5,6,10,11,13,15,17};
int[] mos = new int[arr.length];
findMiddle(arr,mos);
System.out.println(Arrays.toString(mos));
for (int i = 0; i < arr.length; i++) {
if (mos[i] == 2) {
System.out.print(arr[i]);
System.out.print(" ");
}
}
}
static void findMiddle(int[] arr,int[] mos) {
if (null == arr || arr.length <= 2) {
return;
}
int max = 0;
int min = arr.length-1;
for (int i = 0; i < arr.length; i++) {
max=arr[max]<=arr[i]?i:max;
if (max == i) {
mos[i]++;
}
}
for (int i = arr.length-1; i >=0; i--) {
min=arr[min]>=arr[i]?i:min;
if (min == i) {
mos[i]++;
}
}
}