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 。

题解:
首先应当一个个判断这个数组是否是递增数组,在判断过程中如果出现nums[i]>nums[i+1]的情况,则删除nums[i],注意这个操作只做一次,然后继续向后比对,是否有这种情况出现,但凡有第二次就直接跳出循环,返回false,没有就返回true。

//这是一个更好的解法
function canBeIncreasing(nums: number[]): boolean {
    let i = 0, c = 0
    for (let j = 1; j < nums.length; j++) {
        if (nums[i] >= nums[j]) c++
        if (c > 1) return false
        if (i === 0 || nums[i] < nums[j] || nums[i - 1] < nums[j]) i = j
    }
    return true
};

作者:okisama
链接:https://leetcode.cn/problems/remove-one-element-to-make-the-array-strictly-increasing/solution/by-okisama-auhc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canBeIncreasing = function(nums) {
  for (let i = 0; i < nums.length; i++) {
    let mynum = [...nums];
    mynum.splice(i, 1);
    let index = 1;
    let count = mynum.length - 1;
    while (index < mynum.length) {
      if (mynum[index] > mynum[index - 1]) {
        count--;
      }
      index++;
    }
    if (count == 0) return true;
  }
  return false;
};

当我在写这道题时,遇到一些问题,比如当我删除一个数使其后面成为一个递增序列时,忽略了删除这个数之后,之前本来是递增序列的前面一部分数,变成了递减序列,而我此时的i循环又无法回到前面再一次去检查,差错由此产生

编辑:或许有这样一种方法,首先,先遍历一遍整个数组,如果不是严格递增,删掉一个数字(i>i+1,删除i),保留删除了这个数的数组,再对其进行一次遍历检查,如果还有导致不严格递增的数,就返回false,两个简单的循环就可以完成(待验证)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值