题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组
提示:
1 <= arr.length <= 10^4
1 <= arr[i] <= 10^5
二、解题思路
2.1 暴力法
- 遍历 nums 数组,对于每个元素都遍历一遍其索引后的全部元素
2.2 线性扫描——倒序
-
倒序遍历 nums 数组,从倒数第二位元素开始(倒数第一位元素赋值为 -1)
-
定义记录右侧最大值的变量,初始值为数组最后一位元素
-
然后对于每个遍历的元素,都进行判断,是否小于右侧最大值
-
小于时,当前索引上的元素赋值为右侧最大值
-
大于时,当前索引上的元素赋值为右侧最大值,并让当前遍历的元素成为右侧最大值(通过临时变量完成转换)
三、代码实现
3.1 暴力法
public static int[] replaceElements(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int max = arr[i + 1];
// 遍历当前数组元素后的全部元素,记录下最大值
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] > max) {
max = arr[j];
}
}
arr[i] = max;
}
arr[arr.length - 1] = -1;
return arr;
}
3.2 线性扫描——倒序
public static int[] replaceElements(int[] arr) {
int maxRightNum = arr[arr.length - 1];
// 数组末位元素用 -1 代替
arr[arr.length - 1] = -1;
// 从右往前遍历
for (int i = arr.length - 2; i >= 0; i--) {
if (arr[i] < maxRightNum) {
// 小于右侧最大值时,当前元素设置为当前记录的右侧最大值
arr[i] = maxRightNum;
} else {
// 大于右侧最大值时,当前元素成为新的最大值
int temp = arr[i];
arr[i] = maxRightNum;
maxRightNum = temp;
}
}
return arr;
}
四、执行用时
4.1 暴力法
4.2 线性扫描——倒序
五、部分测试用例
public static void main(String[] args) {
int[] arr = {17, 18, 5, 4, 6, 1}; // output: {18, 6, 6, 6, 1, -1}
int[] result = replaceElements(arr);
System.out.println(result);
}