将每个元素替换为右侧最大元素

174 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

题目描述

给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。 完成所有替换操作后,请你返回这个数组。 来源:力扣(LeetCode)

  • 示例1
输入:arr = [17,18,5,4,6,1]
输出:[18,6,6,6,1,-1]
解释:
- 下标 0 的元素 --> 右侧最大元素是下标 1 的元素 (18)
- 下标 1 的元素 --> 右侧最大元素是下标 4 的元素 (6)
- 下标 2 的元素 --> 右侧最大元素是下标 4 的元素 (6)
- 下标 3 的元素 --> 右侧最大元素是下标 4 的元素 (6)
- 下标 4 的元素 --> 右侧最大元素是下标 5 的元素 (1)
- 下标 5 的元素 --> 右侧没有其他元素,替换为 -1
  • 示例
输入: arr = [400]
输出: [-1]
解释: 下标 0 的元素右侧没有其他元素。

提示:

  • 1 <= arr.length <= 104
  • 1 <= arr[i] <= 105

思路分析

据题可知,给出的数组是一个整数且无序的数组,要求我们将整个数组的中的每个元素和它后面的所有元素都对比一遍,取出最大的值替代它的位置;这个题目看起来和数组的排序还是有一些类似的,都是按顺序排列,只不过数组排序后的所有元素只是位置的交换,而这个直接将小的元素替换掉,只要右边的元素有比它大的元素就可以将它替换掉;由于是取右边大数字替换,可以采用逆序排列替换,从后面开始循环,拿当前的遍历项和前面的元素比大小,若是比它大,就替换掉它,然后继续和前面的数字比大小,若是比它小则取当前遍历项的值,用这个值继续和更前面的作比较,一直循环这一步;当循环结束后,删除数组的最后一个,再push -1到数组里面。

AC代码

let arr = [17,18,5,4,6,1];
function solution(arr) {
    let max = arr[arr.length - 1];
    for(let i = arr.length - 2; i >= 0; i--) {
        let min = arr[i];
        arr[i] = max;
        if( min > max ) {
            max = min;
        }
    }
    arr.pop();
    arr.push(-1);
    console.log(arr);
}
solution(arr)

总结