【力扣 896】单调数列 C++题解(循环)

如果数组是单调递增或单调递减的,那么它是 单调 的。

如果对于所有 i <= j,nums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= j,nums[i]> = nums[j],那么数组 nums 是单调递减的。

当给定的数组 nums 是单调数组时返回 true,否则返回 false。

示例 1:

输入:nums = [1,2,2,3]

输出:true

示例 2:

输入:nums = [6,5,4,4]

输出:true

示例 3:

输入:nums = [1,3,2]

输出:false

提示:

1 <= nums.length <= 105

-105 <= nums[i] <= 105


思路

首先,函数检查nums的长度是否小于或等于2,如果是,那么就直接返回true,因为长度小于或等于2的数组总是单调的。

然后,函数使用一个迭代器it1遍历nums的每一个元素(从第一个元素开始)。在每次循环中,计算当前元素和下一个元素的差diff,如果diff不为0,那么就停止循环。

如果遍历完所有元素都没有找到非零的diff,那么就返回true,表示nums是单调的。

然后,函数检查diff的符号。如果diff大于0,那么就使用一个循环遍历nums的每一个元素,如果当前元素小于前一个元素,那么就返回false,因为这个数组不是递增的。如果diff小于0,那么就使用一个循环遍历nums的每一个元素,如果当前元素大于前一个元素,那么就返回false,因为这个数组不是递减的。

如果遍历完所有元素都没有返回false,那么就返回true,表示nums是单调的。


AC代码

cpp 复制代码
/*
 * @lc app=leetcode.cn id=896 lang=cpp
 *
 * [896] 单调数列
 */

// @lc code=start
class Solution {
   public:
	bool isMonotonic(vector<int>& nums) {
		if (nums.size() <= 2) {
			return true;
		}
		auto it1 = nums.begin();
		int diff = *(it1 + 1) - *it1;
		while (it1 != nums.end() - 2 && !diff) {
			it1++;
			diff = *(it1 + 1) - *it1;
		}
		if (!diff) {
			return true;
		}
		int tmp = nums.front();
		if (diff > 0) {
			for (const int i : nums) {
				if (i < tmp) {
					return false;
				}
				tmp = i;
			}
		} else {
			for (const int i : nums) {
				if (i > tmp) {
					return false;
				}
				tmp = i;
			}
		}
		return true;
	}
};
// @lc code=end
相关推荐
cjinhuo1 天前
标签页、书签太多找不到?AI 分组 + 拼音模糊搜索,开源插件秒解切换难题!
前端·算法·开源
贝塔实验室1 天前
频偏估计方法--快速傅里叶变换(FFT)估计法
网络协议·算法·数学建模·动态规划·信息与通信·信号处理·傅立叶分析
煜3641 天前
C++异常与智能指针
开发语言·c++
光头闪亮亮1 天前
ZBar 环境搭建与快速入门指南
c++
闭着眼睛学算法1 天前
【双机位A卷】华为OD笔试之【模拟】双机位A-新学校选址【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·javascript·c++·python·算法·华为od
玉夏1 天前
【每日算法C#】爬楼梯问题 LeetCode
算法·leetcode·c#
卿摆摆1 天前
【C++】string的模拟实现
开发语言·c++
学好statistics和DS1 天前
【CV】泊松图像融合
算法·计算机视觉
贝塔实验室1 天前
QPSK信号载波同步技术---极性Costas 法载波同步
计算机网络·算法·网络安全·数学建模·信息与通信·信号处理·傅立叶分析
前端小刘哥1 天前
视频直播点播平台EasyDSS视频直播功能的技术实现与应用场景解析
算法