给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。
完成所有替换操作后,请你返回这个数组。
示例:
输入:arr = [17,18,5,4,6,1]
输出:[18,6,6,6,1,-1]
提示:
1 <= arr.length <= 10^4
1 <= arr[i] <= 10^5
思路
对一个数组,从后往前看。对于替换后的数组
- 最后一个元素一定是-1
- 倒数第二个元素一定是最后一个元素:因为对于倒数第二个元素,最右边只有一个元素
- 倒序循环数组:
- 不能从倒数第一个元素开始循环:因为那已经固定为-1了
- 如果从倒数第二个元素开始循环,此时max = arr[arr.length - 1]【因为1 <= arr[i] <= 10^5】,arr[arr.length - 1] = -1。【注意,max是当前元素右边最大的元素】,所以temp = arr[arr.length - 2],arr[arr.lengtj - 2] = max,然后求出下一轮的最大值 max = Math.max(max, temp)。因此可以从倒数第二个元素循环
总结:
- 检查原数组是否为空【虽然题目1 <= arr.length <= 10^4,但是总觉得不安全】
- 如果原数组长度为1,直接替换为-1
- 从倒数第二个元素开始倒叙循环
回答
public static int[] replaceElements(int[] arr) {
if (arr == null || arr.length == 0){
return null;
}
if (arr.length == 1){
return new int[]{-1};
}
int max = arr[arr.length - 1];
arr[arr.length - 1] = -1;
for (int i = arr.length - 2; i > -1; i--){
int temp = arr[i];
arr[i] = max;
max = Math.max(max, temp);
}
return arr;
}