给你一个下标从 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 = 0for (let j = 1; j < nums.length; j++) {if (nums[i] >= nums[j]) c++if (c > 1) return falseif (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,两个简单的循环就可以完成(待验证)