关注 每天一道编程题 专栏,一起学习进步。

题目

Given an array arr, replace every element in that array with the greatest element among the elements to its right, and replace the last element with -1.

After doing so, return the array.

Example 1:

Input: arr = [17,18,5,4,6,1]
Output: [18,6,6,6,1,-1]

Constraints:

1 <= arr.length <= 10^4
1 <= arr[i] <= 10^5

分析

题意:
遍历数组,将当前数字替换成右侧最大的一个数字
最后将末尾的一个数字替换为-1

i=0 17 18 5 4 6 1 ⇒ 18 18 5 4 6 1
i=1 18 18 5 4 6 1 ⇒ 18 6  5 4 6 1
i=2 18 6  5 4 6 1 ⇒ 18 6  6 4 6 1 
i=3 18 6  6 4 6 1 ⇒ 18 6  6 6 6 1 
i=4 18 6  6 6 6 1 ⇒ 18 6  6 6 6 1 
i=5 18 6  6 6 6 1 ⇒ 18 6  6 6 6 -1 

难点:
拿到每个数字时,还得找出其后的最大数,遍历自然能够解决,但是复杂度太高。
下面使用一种嵌套for循环拆成同级的两个for循环的方式

解答

class Solution {
    public int[] replaceElements(int[] arr) {
        
		//创建一个数组专门存放arr[i]之后的最大值
        int[] maxTillNowArr = new int[arr.length];
        
        //初始化最大值
		int curMax = -1;
		
		//从后往前查找,找出arr[i]右边的最大值;这个容易写成从前往后查找,自己想想为什么
        for(int i = arr.length-1; i >= 0; i--)
        {
            curMax = Math.max(curMax, arr[i]);
            maxTillNowArr[i] = curMax;
        }
        
		//将arr[i]替换成右边的最大值
        for(int i = 0; i < arr.length-1; i++)
        {
            arr[i] = maxTillNowArr[i+1];
        }
       
	   // 最后置为 -1
        arr[arr.length-1] = -1;
        
        return arr;
    }
}