题目
如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 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;
}
};
这篇博客主要解析了LeetCode中的896题——单调数列。作者通过举例说明了单调数组的定义,并分享了三种不同的解题思路,包括比较相邻元素确定单调性、利用遍历次数判断和利用差值乘积判断。每种思路都有对应的C++代码实现,突出了解题过程中的思维变化和优化技巧。
952

被折叠的 条评论
为什么被折叠?



