(刷题笔记) Leetcode 896.单调数列

这篇博客主要解析了LeetCode中的896题——单调数列。作者通过举例说明了单调数组的定义,并分享了三种不同的解题思路,包括比较相邻元素确定单调性、利用遍历次数判断和利用差值乘积判断。每种思路都有对应的C++代码实现,突出了解题过程中的思维变化和优化技巧。

题目

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

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

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

示例 1:

输入:[1,2,2,3]
输出:true

示例 2:

输入:[6,5,4,4]
输出:true

示例 3:

输入:[1,3,2]
输出:false

示例 4:

输入:[1,2,4,5]
输出:true

示例 5:

输入:[1,1,1]
输出:true

提示:

1 <= A.length <= 50000
-100000 <= A[i] <= 100000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/monotonic-array

解题思路

简单题,本来想的是比较左中右三个数是否有单调性来免去不单调的时候遍历整个数组的问题,后来发现两个连续相等的数就能破坏这种判断方法,
后来就写了每次遍历整个数组,记录单调情况,如果up和down都大于0,说明整个数组不单调,其他情况单调。这是下面的代码一。

然后看了一下提交记录里其他更快的方法,利用的是满足条件则遍历数组,不满足就停止遍历,记录循环次数,等于数组长度则说明单调,不等于则说明不单调,
这样就能在没有单调性的时候不用遍历整个数组,有单调性的时候只遍历一次数组。唯一可能耗费时间多的情况就是,数组前面有一串相等,只在最后出现了不单调情况。
这是代码二

后面还看了一种方法,用的是乘法,我一开始想了半天设flag,就是不知道怎么设来体现非单调性,后来看别人的答案,就利用本次两数的差值与上次两数的差值的乘积,
小于0说明异号,单调性有改变。这是代码三

这大概就是简单题的魅力?基本上人人能解,但是可能每个人思路都不一样。

代码(C++)

代码一

class Solution {
public:
    bool isMonotonic(vector<int>& A) {
        
        if(A.size()<3) return true;
        int up=0;
        int down=0;
       for(int i=1;i<A.size();++i){
           if(A[i]>A[i-1]) down++;
           else if(A[i]<A[i-1]) up++;
       }
       
      
       if(down!=0&&up!=0){
           return false;
       }

       return true;
    }
};

代码二

class Solution {
public:
    bool isMonotonic(vector<int>& A) {

        int i=1;
        while(i<A.size()&&A[i]>=A[i-1]) i++;
        if(i==A.size()) return true;
        i=1;
        while(i<A.size()&&A[i]<=A[i-1]) i++;
        if(i==A.size()) return true;

        return false;

    }
};

代码三

class Solution {
public:
    bool isMonotonic(vector<int>& A) {

        int flag1=0,flag2=0;

        for(int i=1;i<A.size();++i){

            if(A[i]==A[i-1]) continue;
            else   flag2=A[i]-A[i-1];
            
            if(flag1*flag2<0) return false;
            flag1=flag2;
        }

        return true;

    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值