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

简介: LeetCode 1909. 删除一个元素使数组严格递增

文章目录


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)

相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
152 1
|
7月前
|
机器学习/深度学习 存储 算法
【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)
这篇文章详细解析了力扣热题 347——前 K 个高频元素的三种解法:哈希表+小顶堆、哈希表+快速排序和哈希表+桶排序。每种方法都附有清晰的思路讲解和 Go 语言代码实现。小顶堆方法时间复杂度为 O(n log k),适合处理大规模数据;快速排序方法时间复杂度为 O(n log n),适用于数据量较小的场景;桶排序方法在特定条件下能达到线性时间复杂度 O(n)。文章通过对比分析,帮助读者根据实际需求选择最优解法,并提供了完整的代码示例,是一篇非常实用的算法学习资料。
453 90
|
5月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
215 1
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
129 0
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
116 4
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
113 0
Leetcode第三十三题(搜索旋转排序数组)
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
219 0
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
92 0
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
111 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
239 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行

热门文章

最新文章