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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Non-decreasing Array(Java实现)的更多相关文章
- LeetCode算法题-Convert Sorted Array to Binary Search Tree(Java实现)
这是悦乐书的第166次更新,第168篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第25题(顺位题号是108).给定一个数组,其中元素按升序排序,将其转换为高度平衡的二叉 ...
- LeetCode算法题-Merge Sorted Array(Java实现)
这是悦乐书的第161次更新,第163篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第20题(顺位题号是88).给定两个排序的整数数组nums1和nums2,将nums2中 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Toeplitz Matrix(Java实现)
这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...
- LeetCode算法题-Flood Fill(Java实现)
这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...
- LeetCode算法题-Image Smoother(Java实现)
这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...
- LeetCode算法题-Design LinkedList(Java实现)
这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...
- LeetCode算法题-Design HashMap(Java实现)
这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...
- LeetCode算法题-Design HashSet(Java实现)
这是悦乐书的第298次更新,第317篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第166题(顺位题号是705).不使用任何内建的hash表库设计一个hash集合,应包含 ...
随机推荐
- 并发编程(十六)——java7 深入并发包 ConcurrentHashMap 源码解析
以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容 ...
- C# 8中的范围类型(Range Type)
C# 8.0中加入了一个新的范围类型(Range Type). 这里我们首先展示一些代码,并一步一步为代码添加一些不同的东西, 为大家展示一下范围类型的功能和用法. 我们最原始的代码如下: stati ...
- SignalR学习笔记(四) 性能优化
限制消息发送次数 这种方式在学习笔记(二)- 高并发应用中介绍过,在客户端和服务器端使用定时器来减少消息发送的次数 减少消息数据的大小 服务器端,可以使用JsonIgnore, 来忽略不需要序列化的 ...
- dotnet core使用开源组件FastHttpApi进行web应用开发
FastHttpApi相对于asp.net mvc来说有着更轻量和性能上的优势,性能上面就不在这里介绍了(具体可查看 https://github.com/IKende/FastHttpApi).在这 ...
- JVM(2)--一文读懂垃圾回收
与其他语言相比,例如c/c++,我们都知道,java虚拟机对于程序中产生的垃圾,虚拟机是会自动帮我们进行清除管理的,而像c/c++这些语言平台则需要程序员自己手动对内存进行释放.虽然这种自动帮我们回收 ...
- Magicodes.WeiChat——发送模板消息
在微信开发中,经常会使用到模板消息.因此框架中对此进行了一些封装,并且提供了后台操作界面以及日志查看等功能,下面开始逐步介绍开发操作以及使用. 微信公众平台配置 首先,需要申请开通模板消息功能,如下图 ...
- SpringBoot基础系列-使用Profiles
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996884.html SpringBoot基础系列-使用Profile 概述 Profi ...
- 【转】java缩放图片、java裁剪图片代码工具类
一首先看下效果 二工具类 三测试类 在系统的上传图片功能中,我们无法控制用户上传图片的大小,用户可能会上传大到几十M小到1k的的图片,一方面图片太大占据了太多的空间,另一方面,我们没办法在页面上显示统 ...
- python学习笔记(十 一)、GUI图形用户界面
python图形用户界面就是包含按钮.输入框.选择框等组件的窗口.主要依赖与工具包进行代码编写.python GUI工具包并发互斥的,你可以选择多个工具包进行安装,有极大选择空间.每个工具包都有不同用 ...
- 生产者消费者C++实现
#include<string>#include<iostream>#include<process.h>#include<windows.h>#inc ...