题目:以时间复杂度 O(n) 从长度为n的数组中找出同时满足以下两个条件的所有元素:
- 该元素比放在它左边所有的元素都要大;
- 该元素比放在它右边所有的元素都要小;
示例:
输入:[1, 2, 4, 3, 5, 9]
输出:[2, 5]
/**
* @param {number[]} nums
* @return {number[][]}
*/
var res = function(nums) {
};
解题思路:
- 由于限制了时间复杂度为O(n),因此不能用嵌套循环的方法
- 首先倒序(从右往左)遍历,找到当前 index 右边所有元素中的最小值
- 然后正序(从左往右)遍历,判断当前元素是否为它左边所有元素的最大值,如果满足条件,最后再跟当前 index 右边的最小值对比,获取符合条件的元素。
// code:
/**
* @param {number[]} nums
* @return {number[][]}
*/
var res = function(arr) {
if (arr.length < 3) {
return [];
}
const res = [];
const m = new Array(arr.length);
let min = arr[arr.length - 1];
// 先生成一个新数组,每个位置的值表示它右边做小的值(不包含它本身)
for(let i = arr.length - 2; i > 0; i--) {
m[i] = min;
if (arr[i] < min) {
min = arr[i];
}
m[i - 1] = min;
};
console.log(m);
let max = arr[0];
for(let i = 1; i < arr.length - 1; i++) {
// 如果当前值是比它前面最大的值还要大
if (arr[i] > max) {
max = arr[i];
// 并且比它右边最小的值还要小,则满足条件
if (arr[i] < m[i]) {
res.push(max);
}
}
}
return res;
}
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!