LeetCode1909 删除一个元素使数组严格递增

server/2025/1/17 3:10:29/

判断删除一个元素后数组是否可变为严格递增

一、问题描述

在编程中,我们有时会遇到这样一个有趣的问题:给定一个下标从 0 开始的整数数组 nums,我们需要判断是否恰好删除一个元素后,该数组可以变成严格递增的,或者如果数组本身已经是严格递增的,也满足条件。这里对于严格递增的定义是对于任意下标的 1 <= i < nums.length 都满足 nums[i - 1] < nums[i]

二、解决思路

为了解决这个问题,我们主要分为两步:

  1. 检查原数组是否严格递增
    我们编写了一个辅助函数 isStrictlyIncreasing,该函数接收一个整数数组 nums 和数组的长度 numsSize。其核心思想是遍历数组,从第二个元素开始,将其与前一个元素进行比较。如果发现存在 nums[i - 1] >= nums[i] 的情况,说明原数组不是严格递增的,函数将返回 false。若遍历完整个数组都满足 nums[i - 1] < nums[i] 的条件,函数将返回 true。

    #include <stdio.h>
    #include <stdlib.h>// 检查数组是否严格递增
    bool isStrictlyIncreasing(int* nums, int numsSize) {for (int i = 1; i < numsSize; i++) {if (nums[i - 1] >= nums[i]) {return false;}}return true;
    }
  2. 尝试删除元素并检查
    如果原数组不是严格递增的,我们需要尝试删除每一个元素,然后检查删除该元素后的数组是否严格递增。为此,我们编写了 canBeIncreasing 函数。该函数首先调用 isStrictlyIncreasing 检查原数组。若原数组满足条件,直接返回 true。若不满足,我们使用 for 循环遍历原数组的每个元素。对于每个元素,我们创建一个新的临时数组 temp,使用 malloc 分配 (numsSize - 1) * sizeof(int) 大小的内存空间。然后使用另一个 for 循环将原数组中除了当前元素外的元素复制到 temp 中,使用 index 变量来记录复制元素的位置。接着调用 isStrictlyIncreasing 函数检查这个临时数组是否严格递增。若满足,释放 temp 的内存并返回 true。若遍历完所有元素的删除情况都不满足,最终返回 false

    bool canBeIncreasing(int* nums, int numsSize) {if (isStrictlyIncreasing(nums, numsSize)) {return true;}for (int i = 0; i < numsSize; i++) {int* temp = (int*)malloc((numsSize - 1) * sizeof(int));int index = 0;for (int j = 0; j < numsSize; j++) {if (j!= i) {temp[index++] = nums[j];}}if (isStrictlyIncreasing(temp, numsSize - 1)) {free(temp);return true;}free(temp);}return false;
    }

    三、代码解释

isStrictlyIncreasing 函数:

  • 该函数的目的是判断一个数组是否严格递增。
  • 从 i = 1 开始遍历数组,比较 nums[i - 1] 和 nums[i] 的大小。
  • 只要发现 nums[i - 1] >= nums[i],说明不满足严格递增的条件,函数返回 false
  • 若整个遍历过程都满足条件,函数最终返回 true

canBeIncreasing 函数:

  • 首先调用 isStrictlyIncreasing 函数对原数组进行检查。
  • 若原数组是严格递增的,函数直接返回 true
  • 若原数组不满足,开始遍历原数组的元素,准备删除每个元素进行尝试。
  • 对于每个元素的删除,创建一个新的临时数组 temp,通过 malloc 分配内存。
  • 将原数组中除当前元素外的元素复制到 temp 中,使用 index 来控制存储位置。
  • 对 temp 调用 isStrictlyIncreasing 函数进行检查。
  • 若满足,释放 temp 的内存并返回 true
  • 若遍历完都不满足,最终返回 false,同时注意释放内存以避免内存泄漏。

四、测试示例

为了测试我们的函数,我们可以编写一个简单的 main 函数:

int main() {int nums[] = {1, 2, 10, 5, 7};int numsSize = sizeof(nums) / sizeof(nums[0]);if (canBeIncreasing(nums, numsSize)) {printf("True\n");} else {printf("False\n");}return 0;
}

五、总结

通过这个问题的解决,我们复习了数组的遍历、元素的比较、动态内存分配和释放等 C 语言编程中的重要概念。在处理类似问题时,我们可以采用这种先检查原状态,再进行尝试修改元素并检查的思路,同时要注意内存管理,避免内存泄漏等问题,确保程序的健壮性和正确性。


http://www.ppmy.cn/server/158978.html

相关文章

微信小程序在使用页面栈保存页面信息时,如何避免数据丢失?

微信小程序在使用页面栈保存页面信息时避免数据丢失的方法&#xff1a; 一、使用全局变量存储关键数据&#xff1a; 定义一个全局变量&#xff0c;例如在 app.js 中&#xff0c;用于存储页面的重要信息。在页面的 onHide 或 onUnload 生命周期中&#xff0c;将需要保存的数据…

Android Auto能够与Android设备整合的几项功能有哪些?

android Auto是Google推出的专为汽车所设计之android功能&#xff0c;旨在取代汽车制造商之原生车载系统来执行android应用与服务并访问与存取android手机内容。由于谷歌退出中国市场等原因导致大部分系统都删除了谷歌的基础服务&#xff0c;需要用户自行安装。 android auto优…

Spring Boot 3.x 整合 Logback 日志框架(支持异步写入)

Spring Boot 3.x 整合 Logback 日志框架&#xff08;支持异步写入&#xff09; 在构建任何应用程序时&#xff0c;良好的日志管理都是必不可少的。日志可以帮助我们监控、调试和跟踪代码的运行情况。 1. 添加日志配置文件 在 /resources 资源目录下&#xff0c;创建名为 log…

node.js中实现token的生成与验证

Token&#xff08;令牌&#xff09;是一种用于在客户端和服务器之间安全传输信息的加密字符串。在Web开发中&#xff0c;Token常用于身份验证和授权&#xff0c;确保用户能够安全地访问受保护的资源。 作用与意义 身份验证&#xff1a;Token可以用来验证用户的身份&#xff0…

LabVIEW光流跟踪算法

1. 光流跟踪算法的概述 光流&#xff08;Optical Flow&#xff09;是一种图像处理技术&#xff0c;用于估算图像中像素点的运动。通过比较连续帧图像&#xff0c;光流算法可以分析图像中的运动信息&#xff0c;广泛用于目标跟踪、运动检测和视频处理等场景。该示例使用了NI Vi…

【深度学习】关键技术-优化算法(Optimization Algorithms)详解与代码示例

优化算法详解与代码示例 优化算法是深度学习中的关键组成部分&#xff0c;用于调整神经网络的权重和偏置&#xff0c;以最小化损失函数的值。以下是常见的优化算法及其详细介绍和代码示例&#xff1a; 1. 梯度下降法 (Gradient Descent) 原理&#xff1a; 通过计算损失函数对…

Browser-Use Web UI:浏览器自动化与AI的完美结合

Browser-Use Web UI:浏览器自动化与AI的完美结合 前言简介一、克隆项目二、安装与环境配置1. Python版本要求2. 安装依赖3. 安装 Playwright4. 配置环境变量(非必要步骤)三、启动 WebUI四、配置1. Agent设置2. 大模型设置3. 浏览器相关设置4. 运行 Agent结语前言 Web UI是在…

OpenStack 网络服务的插件架构

OpenStack 的网络服务具有灵活的插件架构&#xff0c;可支持多种不同类型的插件以满足不同的网络需求。以下是对 OpenStack 网络服务插件架构中一些常见插件类型的介绍&#xff1a; 一、SDN 插件 Neutron 与 SDN 的集成&#xff1a;在 OpenStack 网络服务里&#xff0c;SDN 插…