解法1(C).
首先假设数组是递增的,并通过遍历数组来检查这一假设是否成立。如果在遍历过程中发现递减的情况,并且之前已经确定是递增的,则函数返回 false
。如果整个数组都是递增或递减的(或者包含相等的元素),则函数返回 true
。这种方法只遍历数组一次,因此是高效的
bool isMonotonic(int* nums, int numsSize) {
// 假设初始为递增
bool increasing = true;
// 假设初始无变化,用于检测递减
bool decreasing = false;
for (int i = 1; i < numsSize; i++) {
if (nums[i] < nums[i - 1]) {
// 发现递减,如果之前已经确定递增,则不是单调
if (increasing) {
return false;
}
// 更新为递减状态
decreasing = true;
} else if (nums[i] > nums[i - 1]) {
// 发现递增,如果之前已经确定递减,则不是单调
if (decreasing) {
return false;
}
// 保持递增状态
}
// 如果相等,则不改变状态
} 附提交记录
case1、case3都通过了,只有case2没过,心好累,忘记前一个数和后一个数相等的情况了。
解法2.
Python版本:
初稿有点小问题,不知道读者是否能发现一下:
class Solution(object):
def isMonotonic(self, nums):
# 初始假设数组是递增的,且未检测到递减
increasing = True
# 初始假设数组未检测到递增(用于检测递减,但开始时我们不知道)
decreasing = False
n = len(nums)
for i in range(1, n): # 从第二个元素开始比较
if nums[i] < nums[i - 1]:
# 发现递减
if increasing: # 如果之前假设是递增的,则现在不是单调的
return False
decreasing = True # 更新为递减状态
increasing = False # 既然已经递减,递增的假设就不再成立
elif nums[i] > nums[i - 1]:
# 发现递增(这里其实可以省略,因为递减状态会由上面的条件更新)
# 但为了保持代码的清晰性,我们仍然保留这个条件
decreasing = False # 如果之前假设是递减的,但现在发现递增,则更新状态
elif nums[i] == nums[i - 1]:
continue
# 如果循环中没有返回False,则数组是单调的
return True
以下是修改过后的版本:
class Solution(object):
def isMonotonic(self, nums):
if (len(nums) == 1):
return True
else:
flag = False
pivot = 0
sign = 0
while (flag == False and pivot + 1 < len(nums)):
if (nums[pivot] < nums[pivot + 1]):
sign = 1
flag = True
elif (nums[pivot] > nums[pivot + 1]):
sign = -1
flag = True
pivot = pivot + 1
if (sign == 0):
return True
elif (sign == 1):
for i in range(len(nums) - 1):
if (nums[i] > nums[i + 1]):
return False
else:
for i in range(len(nums) - 1):
if (nums[i] < nums[i + 1]):
return False
return True