当前位置: 首页 > news >正文

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

这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

转载于:https://www.cnblogs.com/xiaochuan94/p/10574976.html

相关文章:

  • 我的IT转行之路
  • 读书笔记之《实战Java虚拟机》(6):性能监控工具
  • B-树(B+树) 学习总结
  • 【DAY24】内省,NIO的学习笔记
  • 双亲委派模型与Tomcat类加载架构
  • JavaScript事件详解
  • 明文存密码成惯例?Facebook 6 亿用户密码可被 2 万员工直接看
  • 用grunt搭建自动化的web前端开发环境-完整教程
  • 强化学习遭遇瓶颈!分层RL将成为突破的希望
  • [改善Java代码]不同的场景使用不同的泛型通配符
  • Java 混淆那些事(二):认识 ProGuard GUI
  • yii2权限控制rbac之rule详细讲解
  • Solr简单介绍
  • 可视区域懒加载
  • 如何自学编程?学习方法在这里!
  • Javascript设计模式学习之Observer(观察者)模式
  • JS 面试题总结
  • js操作时间(持续更新)
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • MySQL-事务管理(基础)
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • React-flux杂记
  • SpriteKit 技巧之添加背景图片
  • vue-loader 源码解析系列之 selector
  • win10下安装mysql5.7
  • 对象引论
  • 目录与文件属性:编写ls
  • 设计模式(12)迭代器模式(讲解+应用)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 我与Jetbrains的这些年
  • 最简单的无缝轮播
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Linux(权限管理)
  • $().each和$.each的区别
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (二)fiber的基本认识
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)终结任务
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (四)图像的%2线性拉伸
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • .apk文件,IIS不支持下载解决
  • .md即markdown文件的基本常用编写语法
  • .Net各种迷惑命名解释
  • .net和jar包windows服务部署
  • .net项目IIS、VS 附加进程调试
  • .Net语言中的StringBuilder:入门到精通
  • .sdf和.msp文件读取