首先。假设数组为nums[] = {1, 4 3, 6, 8,10}。很明显可以看出 6、8大于左边所有数缺小于右边所有数。那如果用代码表示思路是怎么样子的?
我们可以开一个leftmax数组和一个rightmin数组。分别用来存放左边的最大值和右边的最小值
nums[] = {
1,4,3,6,8,10}
leftmax[] = {
1,4,4,6,8,10} // leftmax[0] = nums[0] leftmax[i] = max(leftmax[i-1], nums[i]) i++ 从左往右
rightmin[] = {
1,3,3,6,8,10} // rightmin[5]= nums[5] rightmin[i] = min(rightmin[i+1], nums[i]) i-- 从右往左
// 然后开始遍历arr数组 nums[i] > leftmax[i-1] 同时 nums[i] < rightmin[i + 1] ==> nums[i] 满足要求
// 表示arr[i]大于他左边的最大值同时小于右边的最小值 即可证明在做左边最大,在右边最小
4比左边最大值1大,比右边最小值3大。不符合比右边小的条件
3比左边最大值4小,不符合比左边大的条件
6比左边最大值4大,比右边最小值8小,满足条件
8比左边最大值6大,比右边最小值10小,满足条件
用代码表示如下
// 左边最大值
int[] leftmax= new int[nums.length];
leftmax[0] = nums[0]; // 赋值第一个元素
for(int i = 1; i < nums.length - 1; i++) {
leftmax[i] = Math.max(nums[i], leftmax[i - 1]);
}
// 右边最小值
int[] rightmin= new int[nums.length];
rightmin[nums.length - 1] = nums[nums.length - 1]; // 赋值最后一个元素
for(int i = nums.length - 2; i > 0; i--) {
rightmin[i] = Math.min(rightmin[i + 1], nums[i]);
}
// 遍历原数组
for(int i = 1; i < nums.length - 1; i++) {
if(nums[i] > leftmax[i - 1] && nums[i] < rightmin[i + 1]) {
return nums[i];
}
}