Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

给你一个数组[2,1,2,4,3],你返回数组 [4,2,4,−1,−1] #142

Open
sisterAn opened this issue Dec 27, 2020 · 10 comments
Open

给你一个数组[2,1,2,4,3],你返回数组 [4,2,4,−1,−1] #142

sisterAn opened this issue Dec 27, 2020 · 10 comments
Labels

Comments

@sisterAn
Copy link
Owner

sisterAn commented Dec 27, 2020

给你一个数组 [2,1,2,4,3] ,你返回数组 [4,2,4,−1,−1]

解释:
第一个 2 后面比 2 大的数是 4 ; 1 后面比 1 大的数是 2 ;第二个 2 后面比 2 大的数是 4; 4 后面没有比 4 大的数,填 -13 后面没有比 3 大的数,填 -1

@gaowujian
Copy link

gaowujian commented Dec 28, 2020

const arr = [2, 1, 2, 4, 3];
function test(arr) {
  let len = arr.length;
  let left = 0;
  let right = len - 1;
  const result = [];
  let myBeIndex;
  let inserted = false;
  for (let i = 0; i < arr.length; i++) {
    const element = arr[i];
    left = i + 1;
    right = len - 1;
    inserted = false;
    while (left <= right) {
      if (arr[left] > element) {
        result.push(arr[left]);
        inserted = true;
        right = len - 1;
        break;
      }
      if (arr[right] > element) {
        myBeIndex = right;
      }
      left++;
      right--;
    }

    if (myBeIndex) {
      result.push(arr[myBeIndex]);
      inserted = true;
      myBeIndex = null;
    }
    if (!inserted) {
      result.push(-1);
    }
  }
  return result;
}

console.log(test(arr));

@hundren
Copy link

hundren commented Dec 28, 2020

function arrFormat(arr){
  let _arr = []
  for (let index = 0; index < arr.length; index++) {
    const val = arr[index];
    //找出这个值之后的数组
    const afterArr = arr.slice(index,arr.length)
    //找出第一个最大值的index
    const firstBiggerIndex = afterArr.findIndex(afterVal=>{
      return afterVal > val
    })
    if(firstBiggerIndex > -1){
      _arr.push(afterArr[firstBiggerIndex])
    }else{
      _arr.push(-1)
    }
  }
  console.log('_arr',_arr)
  return _arr
}
arrFormat([2,1,2,4,3])

@linlinyang
Copy link

linlinyang commented Dec 28, 2020

时间复杂度O(n)
空间复杂度L(n)

function arrFormat(arr: number[]): number[]{
    const len: number = arr.length;
    const stack: number[] = [arr[0]];
    const ret: number[] = new Array(len).fill(-1);
    const map: Record<number, number[]> = arr.reduce((acc: Record<number, number[]>, key: number, index: number) => {
        if (acc[key]) {
            acc[key].push(index);
        } else {
            acc[key] = [index];
        }
        return acc;
    }, Object.create(null));

    for (let i: number = 1; i < len; i++) {
        const cur = arr[i];
        while (cur > stack[stack.length - 1]) {
            const key: number = stack.pop() as number;
            const index: number = map[key].pop() as number;
            ret[index] = cur;
        }
        stack.push(cur);
    }

    return ret;
}

@mx52jing
Copy link

const arr = [2,1,2,4,3]

const f = arr => {
  if(!arr.length) return []
  const len = arr.length
  let l = 0,
      r = l + 1,
      res = []
  while(res.length < len) {
    let cur = arr[l],
        next = arr[r]
    if(next > cur) {
      res.push(next)
      l += 1
      r = l + 1
    }else if(r >= len - 1){
      res.push(-1)
      l += 1
      r = l + 1
    }else {
      r += 1
    }
  }
  return res
}

const result = f(arr)

console.log(result)

@sunsmeil
Copy link

// 暴力法
function test (ary) {
  let result = []
  for(let i = 0; i < ary.length; i++) {
    let value = ary[i]
    let j = i + 1
    while(j < ary.length) {
      if(ary[j] > ary[i]) {
        result.push(ary[j])
        break
      }else {
        j++
     }
    }
    if(!result[i]){
      result[i] = -1
    }
  }
  return result
}
console.log(test([2,1,2,4,3]))

@sunsmeil
Copy link

var nextGreaterElement = function(nums1, nums2) {
 //整体思路:
 //1.维护一个单调递减的栈,如果遇到比栈顶大的元素就是第一个比自己大的了
 //2.那么用key表示当前的数,nums[i]表示比key大的第一个数
 //3.枚举nums1找存在的key里的value值即可
  let map = new Map()
  let res = []
  let m = nums2.length
  let stack = []
  for(let i = 0; i < m; i++){
    //栈顶元素存在,并且当前的元素大于栈顶  
    while(stack.length && nums2[i] > stack[stack.length - 1]){
      map.set(stack.pop(), nums2[i]) 
    }  
    stack.push(nums2[i])
  }
  //栈内还有元素,说明后面没有比自己小的了
  while(stack.length){
    map.set(stack.pop(), -1)
  }
  nums1.forEach(item => {
    res.push(map.get(item))
  })
  return res
};

@yokots
Copy link

yokots commented Jan 2, 2021

const arr = [2, 1, 2, 4, 3];

const result = arr.map((m, index) => {
  const t = arr.slice(index).find(n => n > m);
  return t === undefined ? -1 : t;
});

console.log(result);

@skychx
Copy link

skychx commented Apr 13, 2021

这个应该放在数据结构「栈」里,这道题其实考察的是单调栈,原题其实是 LeetCode 503: 下一个更大元素 II

@skychx
Copy link

skychx commented Apr 13, 2021

这个应该放在数据结构「栈」里,这道题其实考察的是单调栈,原题其实是 LeetCode 503: 下一个更大元素 II

function nextGreaterElements(nums: number[]): number[] {
    let stack: number[] = [];
    let res: number[] = new Array(nums.length).fill(-1);
    let len = nums.length;

    for(let i = 2 * len - 1; i >= 0; i--) {
        while(stack.length !== 0 && stack[stack.length - 1] <= nums[i % len]) {
            stack.pop();
        }
        res[i % len] = stack.length === 0 ? -1 : stack[stack.length - 1];

        stack.push(nums[i % len]);
    }

    return res;
};

@xllpiupiu
Copy link

var nextGreaterElements = function (nums) {
    let res = new Array(nums.length).fill(-1)
    let stack = []
    stack.push(0)
    let numsLen = nums.length
    for (let i = 1, len = nums.length; i < len; i++) {
        while (stack.length && nums[i ] > nums[stack[stack.length - 1]]) {
            res[stack[stack.length - 1]] = nums[i]
            stack.pop()
        }
        stack.push(i)
    }
    return res
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

9 participants