lgwebdream / FE-Interview

🔥🔥🔥 前端面试,独有前端面试题详解,前端面试刷题必备,1000+前端面试真题,Html、Css、JavaScript、Vue、React、Node、TypeScript、Webpack、算法、网络与安全、浏览器
https://lgwebdream.github.io/FE-Interview/
Other
6.76k stars 897 forks source link

Day328:给定一个数组,按找到每个元素右侧第一个比它大的数字,没有的话返回-1 规则返回一个数组 #1156

Open Genzhen opened 3 years ago

Genzhen commented 3 years ago

每日一题会在下午四点在交流群集中讨论,五点小程序中更新答案 欢迎大家在下方发表自己的优质见解

二维码加载失败可点击 小程序二维码

扫描下方二维码,收藏关注,及时获取答案以及详细解析,同时可解锁800+道前端面试题。


参考代码实现

1)暴力双重循环

function findMaxRight(array) {
  let result = [];
  for (let i = 0; i < array.length - 1; i++) {
    for (let j = i + 1; j < array.length; j++) {
      if (array[j] > array[i]) {
        result[i] = array[j];
        break;
      } else {
        result[i] = -1;
      }
    }
  }
  result[result.length] = -1;
  return result;
}

2)利用栈的特性

function findMaxRightWithStack(array) {
  const size = array.length;
  let indexArr = [0];
  let result = [];
  let index = 1;
  while (index < size) {
    if (
      indexArr.length > 0 &&
      array[indexArr[indexArr.length - 1]] < array[index]
    ) {
      result[indexArr[indexArr.length - 1]] = array[index];
      indexArr.pop();
    } else {
      indexArr.push(index);
      index++;
    }
  }
  indexArr.forEach((item) => {
    result[item] = -1;
  });
  return result;
}

3)单调递减栈, 反向遍历

const firstBiggerItem = (T) => {
  const res = new Array(T.length).fill(-1);
  const stack = [];
  for (let i = T.length - 1; i >= 0; i--) {
    while (stack.length && T[i] >= T[stack[stack.length - 1]]) {
      stack.pop();
    }
    if (stack.length && T[i] < T[stack[stack.length - 1]]) {
      res[i] = T[stack[stack.length - 1]];
    }
    stack.push(i);
  }
  return res;
};
// test
var T = [2, 6, 3, 8, 10, 9];
console.log(firstBiggerItem(T));
wjiantao commented 2 years ago

大佬😊

wjiantao commented 2 years ago

只会双循环是不是废了