Leetcode 665 非递减数列

2024-04-10 12:12
文章标签 leetcode 665 数列 递减

本文主要是介绍Leetcode 665 非递减数列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、问题描述
  • 二、示例及约束
  • 三、代码
    • 方法一:直接判断
    • 方法二:修改后判断
  • 四、总结

一、问题描述

  给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。
  我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。

二、示例及约束

示例 1:
输入: nums = [4,2,3]
输出: true
解释: 你可以通过把第一个 4 变成 1 来使得它成为一个非递减数列。

示例 2:
输入: nums = [4,2,1]
输出: false
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。

示例 3:
输入: nums = [1]
输出: true

示例 4:
输入: nums = [3,1]
输出: true

示例 5:
输入: nums = [3,4,2,3]
输出: false

提示:
● n == nums.length
● 1 <= n <= 1 0 4 10^4 104
− 1 0 5 -10^5 105 <= nums[i] <= 1 0 5 10^5 105

三、代码

方法一:直接判断

class Solution {
public:bool checkPossibility(vector<int>& nums) {int count = 0, n = nums.size();//如果n小于3时,一定能成为非递减数列if (n <= 2) {return true;}for (int i = 0; i < n - 1; i++) {//如果发现相邻递减,count计数加1if (nums[i] > nums[i + 1]) {count++;//count大于1时,修改一个不够成为非递减数列if (count > 1) {return false;} /*count小于等于1时,不一定就是非递减数列,如自用示例5中的样例[3,4,2,3]。对于这个样例来说,想让他变成非递减数列,那么在第一次发现递减情况时有两种情况,将2变成4,或将4变成3这两种方式,但是这两种方式都行不通,说明它不能修改成非递减数列。即应在第一次发现递减情况(此时称之为数1和数2)时设立两个额外的判断标准:数1应该小于等于往后隔一位的数,或数2应该大于等于往前隔一位的数。若这两个标准都不通过,说明不能修改成非递减数列。*/if (i >= 1 && i <= n - 3) {//注意下标if (nums[i + 2] < nums[i] && nums[i - 1] > nums[i + 1] ) {return false;}}}}//false情况全部判断完,其余则是true情况return true;}
};

方法二:修改后判断

class Solution {
public:bool checkPossibility(vector<int> &nums) {int n = nums.size(), cnt = 0;for (int i = 0; i < n - 1; ++i) {//用x来记录当前遍历到的数,y来记录x的后一位数int x = nums[i], y = nums[i + 1];if (x > y) {//递减情况cnt加1cnt++;//cnt大于1则表示不能修改成非递减数列if (cnt > 1) {return false;}//如果发现x的后一位比x的前一位还小,那么将x的后一位修改成x,如果修改之后cnt还是大于1,说明修改1次不够使其成为非递减数列if (i > 0 && y < nums[i - 1]) {nums[i + 1] = x;}}}return true;//return is_sorted(nums.begin(), nums.end());/*这里学习到了is_sorted方法,is_sorted函数是C++标准库中的一个算法,用于判断一个序列是否已经按照指定的排序准则排序好了,复杂度与数组长度有关。它接受两个迭代器参数,指定序列的范围,并返回一个布尔值来指示序列是否已按照升序排列。如果序列已经排序好了,则返回true;否则返回false。*/}
};

四、总结

时间复杂度:
方法一:O(n),其中 n 是数组 nums 的长度。
方法二:O(n),其中 n 是数组 nums 的长度。
空间复杂度:
方法一:O(1)。
方法二:O(1)。

方法时间复杂度空间复杂度
方法一O( n n n)O(1)
方法二O( n n n)O(1)

这篇关于Leetcode 665 非递减数列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891032

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

【JavaScript】LeetCode:21-25

文章目录 21 最大子数组和22 合并区间23 轮转数组24 除自身以外数组的乘积25 缺失的第一个正数 21 最大子数组和 贪心 / 动态规划贪心:连续和(count)< 0时,放弃当前起点的连续和,将下一个数作为新起点,这里提供使用贪心算法解决本题的代码。动态规划:dp[i]:以nums[i]为结尾的最长连续子序列(子数组)和。 dp[i] = max(dp[i - 1]