leetcode 之单调数列 简单的题目不简单

233 阅读3分钟

leetcode 之单调数列 一道简单的题目也有不简单的地方

哈喽哈喽,我是你们的金樽清酒,每日分享一题。今天我给大家分享的是单调数列的。看似是一道简单的题目,但是它的解法十分简洁,一些内置的函数我都没有见过。

题目

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

如果对于所有 i <= jnums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= jnums[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

题目很简单,让我们判断一个数组是单调的嘛。看到这个题目,我想的是遍历一下。然后判断后一项减前一项是否总与第一项和第二项的差是同号的。但是呢,这种写法会有问题,那就是一,二项相等的情况。显然这是不行的。为什么会这么想,因为我做的前一题是否等差就是这么做的。话不多说,直接看正确的答案。

题解

var isMonotonic = function(nums) {
    return isSorted(nums) || isSorted(nums.reverse());
};

function isSorted(nums) {
    return nums.slice(1).every((item, i) => nums[i] <= item)
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/monotonic-array/solutions/624659/dan-diao-shu-lie-by-leetcode-solution-ysex/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

var isMonotonic = function(nums) { return isSorted(nums) || isSorted(nums.reverse()); }; function isSorted(nums) { return nums.slice(1).every((item, i) => nums[i] <= item) } 帮我分析一下这段代码

这段代码是一个 JavaScript 函数,名为 isMonotonic,其作用是检查给定数组 nums 是否是单调递增或单调递减的。

让我们逐步分析这段代码:

  1. var isMonotonic = function(nums) { ... }: 这是一个函数声明,定义了一个名为 isMonotonic 的函数,它接受一个参数 nums,该参数是一个数组。

  2. return isSorted(nums) || isSorted(nums.reverse());: 在这一行中,函数 isMonotonic 返回两个表达式的逻辑或结果:

    • isSorted(nums): 调用 isSorted 函数检查原始数组 nums 是否是单调递增或单调递减。
    • isSorted(nums.reverse()): 调用 reverse() 方法反转数组 nums,然后再调用 isSorted 函数检查反转后的数组是否是单调递增或单调递减。
  3. function isSorted(nums) { ... }: 这是一个名为 isSorted 的函数,它接受一个参数 nums,该参数是一个数组。这个函数用于检查给定的数组是否是单调递增的。

  4. return nums.slice(1).every((item, i) => nums[i] <= item): 在这个函数中,它使用了数组的 slice() 方法来获取原数组的一个子数组(从索引 1 开始到末尾),然后调用 every() 方法对这个子数组进行遍历。every() 方法用于检查数组中的每个元素是否满足给定的条件。这里的条件是:当前元素必须大于或等于前一个元素。如果所有元素都满足这个条件,那么数组就是单调递增的,函数返回 true;否则返回 false

综上所述,这段代码的作用是判断给定数组 nums 是否是单调递增或单调递减的。它通过调用 isSorted 函数两次来实现,一次是针对原始数组,一次是针对反转后的数组

总结

这道题用了js的内置函数siice()获取了原数组的一个子元素。用every()来遍历检查数组中的元素是否符合条件。最后再反转数组,判断递增递减这么两种情况。reverse()方法就是将数组反转。怎么样是不是很简洁很帅气。

假如您也和我一样,在准备春招。欢迎加我微信shunwuyu,这里有几十位一心去大厂的友友可以相互鼓励,分享信息,模拟面试,共读源码,齐刷算法,手撕面经。来吧,友友们!”