题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组
说明:
1 <= n <= 10 ^ 4
- 10 ^ 5 <= nums[i] <= 10 ^ 5
二、解题思路
-
因可以改变一次数组元素的值,那么定义一个变量用来记录改变元素的次数,大于 1 次时即返回 false
-
遍历数组,判断当前遍历元素是否小于前一个元素
-
小于前一个元素时,还需要判断是否小于前二个元素
-
如果小于前一个且小于前二个元素时,那么只能将当前元素改变为前一个元素的值,改变次数的变量加 1
-
如果当前遍历元素仅小于前一个元素且大于等于前二个元素时,那么改变前一个元素的值为当前元素的值
三、代码实现
public static boolean checkPossibility(int[] nums) {
// 定义变量记录改变元素的次数
int changeCount = 0;
for (int i = 1; i < nums.length; i++) {
// 当前遍历元素小于之前的元素时,非递增的情况
if (nums[i] - nums[i - 1] < 0) {
// 当前元素不仅小于前面一个元素,且小于前面的第二个元素时,则需要改变当前元素为大值(即前一个元素的值)
// 比如:{3, 4, 2, 3},需要将 2 换成 4,如果将 4 换成 2,则 2 < 3,不满足非递减规则
// i > 1,当前遍历元素不为第 2 位时,否则无法获取到前二位元素
if (i > 1 && (nums[i] - nums[i - 2] < 0)) {
nums[i] = nums[i - 1];
} else {
// 普通情况下将当前元素的前一个较大元素改变成当前元素
// 比如:{4, 2, 3},将 4 换成 2
nums[i - 1] = nums[i];
}
changeCount ++;
}
// 改变次数大于 1 次时,返回 false
if (changeCount > 1) {
return false;
}
}
return true;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
boolean nums = {4, 2, 3}; // output:true
// boolean nums = {4, 2, 1}; // output:false
// boolean nums = {3, 4, 2, 3}; // output:false;
boolean result = checkPossibility(nums);
System.out.println(result);
}