列表

详情


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 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: bool canBeIncreasing(vector<int>& nums) { } };

java 解法, 执行用时: 0 ms, 内存消耗: 40.4 MB, 提交时间: 2023-09-27 14:59:25

class Solution {
  public boolean canBeIncreasing(int[] nums) {
    int cnt = 0;
    for (int i = 1; i < nums.length && cnt <= 1; i++) {
      if (nums[i] > nums[i - 1]) continue;
      cnt++;
      if (i - 1 > 0 && nums[i] <= nums[i - 2]) {
        nums[i] = nums[i - 1];
      } //else {
        //nums[i - 1] = nums[i];
      //}
    }
    return cnt <= 1;
  }
}

python3 解法, 执行用时: 52 ms, 内存消耗: 15.8 MB, 提交时间: 2023-09-27 14:59:07

class Solution:
    def canBeIncreasing(self, nums: List[int]) -> bool:
        n = len(nums)
        # 检查数组 nums 在删去下标为 idx 的元素后是否严格递增
        def check(idx: int) -> bool:
            for i in range(1, n - 1):
                prev, curr = i - 1, i
                if prev >= idx:
                    prev += 1
                if curr >= idx:
                    curr += 1
                if nums[curr] <= nums[prev]:
                    return False
            return True
        
        for i in range(1, n):
            # 寻找非递增相邻下标对
            if nums[i] <= nums[i-1]:
                return check(i) or check(i - 1)
        return True

cpp 解法, 执行用时: 4 ms, 内存消耗: 10.2 MB, 提交时间: 2023-09-27 14:58:52

class Solution {
public:
    bool canBeIncreasing(vector<int>& nums) {
        int n = nums.size();
        // 检查数组 nums 在删去下标为 idx 的元素后是否严格递增
        auto check = [&](const int idx) -> bool{
            for (int i = 1; i < n - 1; ++i){
                int prev = i - 1;
                if (prev >= idx){
                    ++prev;
                }
                int curr = i;
                if (curr >= idx){
                    ++curr;
                }
                if (nums[curr] <= nums[prev]){
                    return false;
                }
            }
            return true;
        };

        for (int i = 1; i < n; ++i){
            // 寻找非递增相邻下标对
            if (nums[i] <= nums[i-1]){
                return check(i - 1) || check(i);
            }
        }
        return true;
    }
};

golang 解法, 执行用时: 4 ms, 内存消耗: 2.8 MB, 提交时间: 2021-07-01 17:48:31

func canBeIncreasing(nums []int) bool {
	n := len(nums)
	cnt := 0
	for i := 1; i < n && cnt <= 1; i++ {
		if nums[i] > nums[i-1] {
			continue
		}
        cnt++
		if i > 1 && nums[i] <= nums[i-2] {
			nums[i] = nums[i-1]
		} else {
			nums[i-1] = nums[i]
		}
	}
	return cnt <= 1
}

上一题