[路飞]_leetcode 1909. 删除一个元素使数组严格递增

428 阅读1分钟

「这是我参与2022首次更文挑战的第40,活动详情查看:2022首次更文挑战

1909. 删除一个元素使数组严格递增

给你一个下标从 0 开始的整数数组 nums ,如果 恰好 删除 一个 元素后,数组 严格递增 ,那么请你返回 true ,否则返回 false 。如果数组本身已经是严格递增的,请你也返回 true 。

数组 nums 是 严格递增 的定义为:对于任意下标的 1 <= i < nums.length 都满足 nums[i - 1] < nums[i] 。

 

示例 1:

输入:nums = [1,2,10,5,7]
输出:true
解释:从 nums 中删除下标 2 处的 10 ,得到 [1,2,5,7] 。
[1,2,5,7] 是严格递增的,所以返回 true 。

示例 2:

输入:nums = [2,3,1,2]
输出:false
解释:
[3,1,2] 是删除下标 0 处元素后得到的结果。
[2,1,2] 是删除下标 1 处元素后得到的结果。
[2,3,2] 是删除下标 2 处元素后得到的结果。
[2,3,1] 是删除下标 3 处元素后得到的结果。
没有任何结果数组是严格递增的,所以返回 false 。

示例 3:

输入:nums = [1,1,1]
输出:false
解释:删除任意元素后的结果都是 [1,1] 。
[1,1] 不是严格递增的,所以返回 false 。

示例 4:

输入:nums = [1,2,3]
输出:true
解释:[1,2,3] 已经是严格递增的,所以返回 true 。  

提示:

2 <= nums.length <= 1000
1 <= nums[i] <= 1000

分析

根据题意我们了解数组严格递增是需要在1 <= i < nums.length范围内任意下标都满足 nums[i - 1] < nums[i]。满足以上要求的数组就是严格递增数组,知道这一点我们可以通过俩种方式来解决这道题。

第一种方法就是首先我了解一个严格递增数组删除一个元素的话它还是严格递增数组。这样我们就可以通过遍历nums得到所有删除一个元素的情况,再看这些存在不存在严格递增数组。存在就返回true否则就返回false

第二种方法就是利用严格递增数组的特性,我们可以通过遍历 nums 数组,找到一个不满足 nums[i - 1] < nums[i] 情况。然后我们需要判断nums[i]是否大于 nums[i - 2],如果大于的就删除nums[i]否则删除nums[i - 1]。我们可以双指针来模拟删除情况。

分步实现 暴力破解

首先通过循环找到所有删除一个元素的情况

for(let i = 0; i < nums.length; i++){
        let arr = [...nums];
        arr.splice(i, 1);
}

每找到一种情况判断当前情况是不是严格数组,如果是返回true否则继续执行下一种情况如果所有情况都不满足则返回false

for(let i = 0; i < nums.length; i++){
        let arr = [...nums];
        arr.splice(i, 1);
        let n = 0
        for(let j = 1; j < arr.length; j++){
            if(arr[j-1] < arr[j]){
                n++
            }
        }
        if(n === arr.length - 1) return true
}
return false

代码实现 暴力破解

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canBeIncreasing = function(nums) {
    for(let i = 0; i < nums.length; i++){
        let arr = [...nums];
        arr.splice(i, 1);
        let n = 0
        for(let j = 1; j < arr.length; j++){
            if(arr[j-1] < arr[j]){
                n++
            }
        }
        if(n === arr.length - 1) return true 
    }
    return false
};

分步实现 利用特性 + 双指针

定义count变量用于存放需要删除元素的个数。 定义index变量慢指针用于存放上一个元素的指针。

let count = 0
let index = 0

通过循环nums数组判断当前元素与上一个元素大于,如果当前元素大于上一个元素说明符合规则,indexf赋值为当前元素并通过continue跳出本次循环。如果不满足就需要判断是越过当前元素(删除)还是越过上个元素并使count++

通过不断的循环,当count>1时就说明删除一个元素不能使数组严格递增返回false,否则就返回true

for(let i = 1; i < nums.length; i++){
        if(nums[index] < nums[i]){
            index = i
            continue
        }
        else if(index === 0 || nums[index-1] < nums[i]){
            index = i;
            count++
        }
        else{
            count++
        }
        if(count > 1){
            return false
        }
        
    }
return true

代码实现 利用特性 + 双指针

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canBeIncreasing = function(nums) {
    let count = 0
    let index = 0
    for(let i = 1; i < nums.length; i++){
        if(nums[index] < nums[i]){
            index = i
            continue
        }
        else if(index === 0 || nums[index-1] < nums[i]){
            index = i;
            count++
        }
        else{
            count++
        }
        if(count > 1){
            return false
        }
    }
    return true
};