单调数列:戳一戳,看原题
如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。
当给定的数组 A 是单调数组时返回 true,否则返回 false。
一、我的解题思路:
本题说的是单调递增或单调递减,但是也不是绝对单调吧~~(我是这么理解的哈,毕竟前后两项可以相同对不?)。所以不能简单的使用前后之差一直大于0或小于0。下面谈一谈我的解法(很好理解的,菜的一批)
1、特殊情况:当只有一个数,或者所有的数全部相等的时,返回true
2、假设第一个数和第二个数不相等是,那么nums[1]-nums[0]是一个非零的数,这个数记为d,要保证单调是不是之后的每一个前一项减去后一项的值必须与d是同号的,是0也没关系,也就是说当nums[i]-nums[i-1])*d<0时,返回false。
3、第二种情况要保证第0项和第一项不相等即可,所以我们必须要找到后一项与前一项不相等,这样才可以保证d不为零。
代码如下:
bool isMonotonic(int* nums, int numsSize){
int i,d;
if(numsSize==1) return true;//只有一个数直接返回true
for(i=1;i<numsSize;i++){
if(nums[i]!=nums[i-1]){
d = nums[i]-nums[i-1];
break;
}
}//for循环保证d不等于0
if(i==numsSize-1) return true;
else{
for(i=1;i<numsSize;i++){
if((nums[i]-nums[i-1])*d<0) return false;
}
return true;
}
}
二、LeetCode解法:
方法一:两次遍历
遍历两次数组,分别判断其是否为单调递增或单调递减。
定义函数:isMonotonic()来判断是否为单调数列。根据传入的参数increasing,执行不同的操作,判断单调递增(后一项大于或等于前一项)或单调递减(后一项小于或等于前一项)
bool isSorted(int* nums, int numsSize, bool increasing) {
if (increasing) {
for (int i = 0; i < numsSize - 1; ++i) {
if (nums[i] > nums[i + 1]) {
return false;
}
}
} else {
for (int i = 0; i < numsSize - 1; ++i) {
if (nums[i] < nums[i + 1]) {
return false;
}
}
}
return true;
}
bool isMonotonic(int* nums, int numsSize) {
return isSorted(nums, numsSize, true) || isSorted(nums, numsSize, false);
}
方法二:一次遍历
遍历数组 \textit{nums}nums,若既遇到了 \textit{nums}[i]>\textit{nums}[i+1]nums[i]>nums[i+1] 又遇到了 \textit{nums}[i']<\textit{nums}[i'+1]nums[i ′ ]<nums[i ′ +1],则说明 \textit{nums}nums 既不是单调递增的,也不是单调递减的。
bool isMonotonic(int* nums, int numsSize) {
bool inc = true, dec = true;
int n = numsSize;
for (int i = 0; i < n - 1; ++i) {
if (nums[i] > nums[i + 1]) {
inc = false;
}
if (nums[i] < nums[i + 1]) {
dec = false;
}
}
return inc || dec;
}