文章目录
1. 题目
2. 解题
1. 题目
给你一个下标从 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
2. 解题
class Solution { public: bool canBeIncreasing(vector<int>& nums) { if(nums.size() <= 2) return true; bool flag = true, prev = 0; for(int i = 0; i < nums.size()-1; ++i) { if(nums[i] >= nums[i+1]) // 删除 i, 或者 i+1 { if(i== nums.size()-2)//删除最后一个即可 return true; if(i+2 < nums.size() && nums[i+2] > nums[i] && asc(nums, i+2)) return true;//删除 i+1 if(i+2 < nums.size() && nums[i+2] <= nums[i] && (i-1<0 || (i-1>=0 && nums[i+1] > nums[i-1])) && asc(nums, i+1)) return true;//删除 i return false; } } return true; } bool asc(vector<int> a, int l) { for(int i = l; i < a.size()-1; ++i) { if(a[i] >= a[i+1]) return false; } return true; } };
0 ms 9.9 MB C++
时间复杂度 O(n)