LeetCode算法题-Non-decreasing Array(Java实现)

给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元 素的情况下,该数组能否变成一个非递减数列。非递减数列定义如下:对 于数组中所有的 i (1 给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元 素的情况下,该数组能否变成一个非递减数列。非递减数列定义如下:对 于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1] 立即下载

这是悦乐书的第283次更新,第300篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第151题(顺位题号是665)。给定一个包含n个整数的数组,您的任务是通过修改最多1个元素来检查它是否可以变为非递减。如果array [i] <= array [i + 1],且0 <= i <n,则我们定义一个数组是非递减的。例如:

输入:[4,2,3]
输出:true
说明:可以修改4为1或2以获得非递减数组。


输入:[4,2,1]
输出:false
说明:通过最多修改一个元素,无法获得非递减数组。

注意:n的范围在[1,1,000]。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

题目的意思是能否只在一步内,将原数组变成一个非递减的数组,也就是递增的数组,并且元素之间的关系是小于等于,即nums[i] <= nums[i+1],0 <= i < n。

特殊情况:数组内的元素小于等于两个,直接返回true。

正常情况:什么情况下,需要修改原数组元素的值?当前元素比前一个元素小的时候,这时我们需要进一步判断,是改当前元素还是改前一个元素?是改大还是改小?

如果当前元素小于其前一个元素:

第一种情况,如果当前元素是数组的第二个元素,改当前元素的前一个元素,前一个元素往小改,将当前元素的值赋值给当前元素的前一个元素;

第二种情况,如果当前元素比其前前个元素值要大,前一个元素往小改,将当前元素的值赋值给当前元素的前一个元素;

第三种情况,当第一和第二种情况都不满足的时候,当前元素往大改,将当前元素的前一个元素值赋值给当前元素。

每改一次都要记数,如果在for循环中count大于1,直接返回false,最后也需要判断count是否小于等于1。

public boolean checkPossibility(int[] nums) {
    if (nums.length <= 2) {
        return true;
    }
    int count = 0;
    for (int i=1; i<nums.length; i++) {
        if (nums[i] < nums[i-1]) {
            if (count > 1) {
                return false;
            }
            if (i == 1 || nums[i] >= nums[i-2]) {
                nums[i-1] = nums[i];
            } else {
                nums[i] = nums[i-1];
            }
            count++;
        }
    }
    return count <= 1;
}

03 第二种解法

我们也可以不修改原数组的原始值。先使用一个循环,找到当前数组中需要修改的元素的索引值,做个标记,然后判断该标记是否以下几种情况:

第一:标记还是初始值,说明该数组是一个递增数组,不用修改任何元素就能满足题目要求。

第二:标记等于0,即第一个元素需要修改,也就是说数组中只有第一个元素大于第二个元素,从第二个元素开始,数组是递增的,只用修改第一个元素就能是整个数组递增。

第三:标记等于数组倒数第二个索引,也就是说倒数第二个元素大于倒数第一个元素,也只需要改一个元素即可。

第四:标记所在元素的前一个、后一个元素之间的关系是小于等于,而标记所在的元素大于后一个元素,所以也只用该标记所在的元素即可。

第五:标记所在的元素比其下下个元素要小或者相等,而标记所在元素比下一个元素要大,也只需要改小标记所在元素即可。

如果是上面这五种情况,表示都符合题目的要求,如果不满足,直接返回false。

public boolean checkPossibility2(int[] nums) {
    if (nums.length <= 2) {
        return true;
    }
    // 初始化索引值为-1
    int index = -1;
    for (int i=0; i<nums.length-1; i++) {
        // 如果当前元素比后一个元素大,说明遇到了需要修改的元素
        if (nums[i] > nums[i+1]) {
            // 如果索引值为-1,表示是第一次遇到需要修改的元素,否则表示已经多次遇到需要修改的值了
            if (index == -1) {
                // 将其索引赋值给index
                index = i;
            } else {
                return false;
            }
        }
    }
    // index为-1表示原数组本身就是个递增数组,为0表示,只用修改第一个元素即可,为nums.length-2表示只用修改倒数第二个元素即可
    if (index == -1 || index == 0 || index == nums.length-2) {
        return true;
    }
    // index所在元素的前后元素是小于等于的关系
    if (nums[index-1] <= nums[index+1]) {
        return true;
    }
    // index所在元素的小于等于其下下个元素
    if (nums[index] <= nums[index+2]) {
        return true;
    }
    return false;
}

04小结

算法专题目前已日更超过四个月,算法题文章151+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

泛微E10 eBuilder低代码平台避坑指南:新手最容易犯的5个错误及解决方案 本文针对泛微E10 eBuilder低代码平台的新手开发者,总结了5个最常见错误及解决方案,包括表单联动配置、流程设计权限、动作流时序、数据加工类型转换和权限管理过度配置等问题。通过实战经验和代码示例,帮助开发者避开常见陷阱,提升开发效率。 阅读详情

相关推荐

华为铁三角(AR、SR、FR)的考核指标设计

以和为核心,通过和实现协同。考核维度分为和,并随市场阶段动态调整权重。

从技术实践立足,从项目管理方法论延伸思考 2780

数组中未出现的最小正整数

题目描述 给定一个无序数组arr,找到数组中未出现的最小正整数 例如arr = [-1, 2, 3, 4]。返回1 arr = [1, 2, 3, 4]。返回5 [要求] 时间复杂度为O(n)O(n),空间复杂度为O(1)O(1) 示例1 输入 [-1,2,3,4] 返回值 1 public int minNumberdisappered(int[] arr) { // return minNumberDisapperedI(arr); return

Bonbon_wen的博客 888

R语言clusterProfiler实战:GO与KEGG富集分析从入门到精通

本文提供了一份详尽的R语言clusterProfiler实战指南,从环境配置、数据导入、基因ID转换到GO与KEGG富集分析及可视化,手把手教你解读生物学意义。文章重点介绍了如何利用clusterProfiler这一强大工具,将差异基因列表转化为清晰的生物学通路与功能故事,并分享了结果解读、可视化以及处理非模式生物等进阶技巧与避坑指南。

weixin_29044713的博客 162

TRPO深度解析:强化学习策略优化的信任区域原理

强化学习(Reinforcement Learning)中,策略梯度方法在训练智能体控制任务时,常因更新步长不当而引发策略崩坏(policy collapse)——一次参数抖动便可能导致模型性能断崖式下降。TRPO(Trust Region Policy Optimization)作为经典算法,通过引入信任区域约束,限制新旧策略间的KL散度,确保每次更新都发生在安全边界内,从而大幅提升训练稳定性。这一思想不仅是PPO(Proximal Policy Optimization)的直接前身,也深刻影响了后续策略

weixin_34072637的博客 497

5种主流触觉传感器对比:GelSight、DIGIT、Taxim、GelSlim和TACTO怎么选?

本文深度对比了GelSight、DIGIT、Taxim、GelSlim和TACTO五种主流触觉传感器的技术原理与应用场景。针对机器人及VR项目的选型需求,文章从光学与电子传感的技术分野出发,分析了各传感器在分辨率、响应速度、集成难度和成本上的核心差异,并提供了从需求出发的实战选型决策框架,帮助开发者找到最适合的触觉解决方案。

weixin_29268637的博客 697

Datalog语言详解

Datalog是一种声明式逻辑编程语言,起源于数据库理论和逻辑编程领域。作为Prolog的子集,它专注于递归查询和推理,通过定义事实和规则来描述数据关系而非计算步骤。Datalog的关键特性包括规则安全、递归、分层否定和扩展聚合功能,保证了程序的终止性和高效性。相较于SQL,Datalog更擅长处理递归查询;相比Prolog,它更注重数据库友好性。Datalog在程序分析、知识图谱、网络安全等领域有广泛应用,其声明式特性使代码简洁易维护,但同时也面临生态系统小、性能调试难等挑战。现代工具如Soufflé、D

bulita great world 1850

java确定数组中未出现的最小正整数,数组中未出现的最小正整数

## return the min number# @param arr int整型一维数组 the array# @return int整型#class Solution:def minNumberdisappered(self , arr ):# write code herepackage main/*** return the min number* @param arr int整型一维数...

weixin_39599166的博客 322

基于Pixhawk与OpenMV的无人机视觉引导精准降落系统设计与实现

本文详细介绍了基于Pixhawk飞控与OpenMV视觉模块的无人机精准降落系统设计与实现。系统通过OpenMV识别Apriltag标签,结合MAVLink通信将视觉数据发送给Pixhawk,实现厘米级精准降落。文章涵盖硬件连接、软件配置、核心代码逻辑解析及实战调试技巧,为无人机自动充电、物流配送等场景提供可靠解决方案。

weixin_29189377的博客 320

python笔试题:给定一个由N个整数组成的数组A,返回A中不出现的最小正整数(大于0)

最近写了一道笔试题,题目:给定一个由N个整数组成的数组A,返回A中不出现的最小正整数(大于0) 例如:给定A=[1,3,6,4,1,2],返回5 给定A=[1,2,3],返回4 给定A=[-1,-3],返回1 python解决方案如下所示: def solution(A): A.sort() c=max(A) i=1 if c<=0: return 1 if c>0: while i<len(A):

weixin_37986839的博客 2743

Unity详细介绍说明限制Unity帧率的方式

在Unity开发中,帧率(FPS,Frames per Second)是一个非常重要的表现标准,它直接影响了游戏运行的流畅度。在某些应用场景里,我们可能需要手动限制帧率。限制帧率可以减少电脑的CPU和GPU负载,使运行更加稳定,同时对于移动设备来说还能有效降低电量消耗。下面就详细介绍几种限制Unity中帧率的方式。

zjw1349547081的专栏 5437

手把手教你学simulink实例--基于Simulink的航空发动机控制系统设计与仿真

航空发动机是飞机的核心动力装置,其性能直接影响飞行器的安全性、经济性和可靠性。现代航空发动机控制系统需要具备高精度、快速响应和强鲁棒性的特点,以适应复杂的飞行环境和任务需求。本项目旨在使用MATLAB/Simulink平台,设计并实现一种适用于涡扇发动机的闭环控制系统,通过调节燃油流量、压气机叶片角度等控制变量,确保发动机在不同工况下稳定运行,并满足推力需求。

MHD0815的博客 277

找出数组中未出现的最小正整数

给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5,3,2,3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4。 思路:设置一个Lb作为标志顺序表,遍历La,如果La中出现一个正整数,则令Lb.elem[La.elem[i]] = 1, 证明La中曾经出现过这个正整数 #include<stdio.h> #include<stdlib.h> #define LISTINITSIZE 10 ty

z_x_y_zxy的博客 3438

嵌入式数字信号处理器(DSP)高频面试题及参考答案

数字信号处理器(DSP)是一种专门设计用于执行数字信号处理任务的微处理器。它具有高度优化的架构,能够高效地执行复杂的数学运算,如快速傅里叶变换(FFT)、卷积、滤波和其他信号处理算法。DSP通常具有高速的中央处理器、专用的硬件乘法器、累加器、硬件循环支持和高速的内存访问能力,以满足实时信号处理的需求。通信:用于调制解调、语音编码、数据压缩、加密和解密。音频处理:如音乐合成、音效增强、语音识别和语音合成。视频和图像处理:包括图像压缩、视频编码、图像增强和模式识别。生物医学工程。

大模型大数据攻城狮的专栏 5272

Leetcode之Non-decreasing Array 问题

问题描述: Given an array with n integers, your task is to check if it could become non-decreasing bymodifying at most 1 element. We define an array is non-decreasing if array[i] holds for everyi (1 <

漫漫学习路 1314

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LeetCode-665. Non-decreasing Array [C++][Java]

Given an arraynumswithnintegers, your task is to check if it could become non-decreasing by modifyingat most one element.

贫道绝缘子的博客 375

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LeetCode-665 Non-decreasing Array

题目描述 : 给定一个具有N个整型元素的数组,检查该数组是否能够通过最多改变一个元素的值,从而使得其本身变为单调非减数组,我们定义单调非减是指对于数组中的每一个有效下标i,都有 a[i] <= a[i+1]。 算法描述 : 对于给定的数组 a1,a2,a3,a4,a5,… 假设a4 < a3. 为了实现数组的单调非减,我们必须改变a4和a3其中的一个值,与此同时,为了后续

Bruce 2579

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LeetCode 665. 非递减数列(Non-decreasing Array)

665. 非递减数列 665. Non-decreasing Array 题目描述 给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]。 LeetCode665. Non-decreas...

weixin_30640291的博客 195

leetcode:(665)Non-Decreasing Array(java)

题目描述:       Given an array with n integers, your task is to check if it could become non-decreasing by modifying at most 1 element. We define an array is non-decreasing if array[i] &lt;= array[i + ...

Sunshine_liang1的博客 479

LeetCode——665. 非递减数列(Non-decreasing Array)——分析及代码(Java)

LeetCode——665. 非递减数列[Non-decreasing Array]——分析及代码[Java]一、题目二、分析及代码1. 直接修改(1)思路(2)代码(3)结果三、其他 一、题目 给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的: 对于数组中所有的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]

江南土豆的博客 341

LeetCode-Non-decreasing Array

LeetCode Java Non-decreasing Array

坟头草一米七五 255

LeetCode 665. Non-decreasing Array

原题链接在这里:https://leetcode.com/problems/non-decreasing-array/description/ 题目: Given an array withnintegers, your task is to check if it could become non-decreasing by modifyingat most1element. W...

weixin_30856725的博客 155

【Leetcode】665. Non-decreasing Array(Easy)

1.题目Given an array with n integers, your task is to check if it could become non-decreasing by modifying at most 1 element.We define an array is non-decreasing if array[i] &lt;= array[i + 1] holds for...

不想做菜鸟的小螃蟹 481

leetcode 665. Non-decreasing Array 非递减数列(中等)

最多只有一次修改某个数字的机会,问能否将数组变为非递减数组。

ln_ydc的专栏 292

Leetcode 665. 非递减数列 665. Non-decreasing Array

给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]。 示例 1: 输入: [4,2,3] 输出: True 解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。 示例 2: 输...

歌古道的博客 265

leetcode 665. Non-decreasing Array | 665. 非递减数列(Java)

题目 https://leetcode.com/problems/non-decreasing-array/ 题解 一开始思路有问题,忽略了一些情况,见草稿。 第一次提交没过,根据 test case 补了下情况,见草稿。 class Solution { public boolean checkPossibility(int[] nums) { if (nums.length <= 2) return true; boolean modified = nu

寒泉 4万+

LeetCode-Easy-Java-Non-decreasing Array

个人记录 题目描述: Given an array with n integers, your task is to check if it could become non-decreasing by modifying at most 1 element. We define an array is non-decreasing if array[i]  holds

doudoudouzoule的博客 292
上一篇: LeetCode算法题-Image Smoother(Java实现)
下一篇: LeetCode算法题-Trim a Binary Search Tree(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值