题目:
以时间复杂度 O(n) 从长度为 n 的数组中找出同时满足下面两个条件的所有元素:
(1)该元素比放在它前面的所有元素都大;
(2)该元素比放在它后面的所有元素都小。
分析:
面试官给的上面冗余的描述,其实一句话即可说明,即以时间复杂度 O(n) 从长度为n的数组中找出所有比左边大比右边的小的元素。
一开始求出所有元素右边最小数,存放到一个数组 rightMin 中,然后从左往右判断当前元素是否大于左边所有元素,如果是则和其右边最小数(存放于最小数组 rightMin)比较,如果小于,则找到了满足条件的元素。
注意: 左右两边第一个数不满足条件。
实现:
#include <iostream>using namespace std;void printPivotElements(int data[], int len) {// 从右往左,寻找每个位置及其之后的最小数int* rightMin = new int[len];int rMin = data[len - 1];for (int i = len - 1; i >= 0; --i) {if (data[i]<rMin) rMin = data[i];rightMin[i] = rMin;}// 从左往右,寻找比左边大且比右边小的数int max = data[0];for (int i = 1; i < len - 1; ++i) {if (data[i] > max) {max = data[i];if (data[i] < rightMin[i+1]) cout << data[i] << endl;}}}int main() {int iTestArray[] = { 1,8,6,9,10,15,12,20 };printPivotElements(iTestArray, sizeof(iTestArray) / sizeof(iTestArray[0]));}
输出:
910