news 2026/8/10 1:53:34

算法题 单调数列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法题 单调数列

单调数列

问题描述

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

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

给定一个整数数组nums,如果它是单调的,返回true;否则返回false

示例

输入:nums=[1,2,2,3]输出:true输入:nums=[6,5,4,4]输出:true输入:nums=[1,3,2]输出:false输入:nums=[1,1,1]输出:true

算法思路

一次遍历

  1. 核心思想

    • 同时检测数组是否可能为单调递增和单调递减
    • 如果发现违反单调递增的条件,标记increasing = false
    • 如果发现违反单调递减的条件,标记decreasing = false
    • 如果两者都为false,说明数组不是单调的
  2. 优化

    • 可以提前终止:一旦发现increasing = falsedecreasing = false,直接返回false
    • 避免两次遍历,只需要一次遍历就能确定结果
  3. 边界情况处理

    • 空数组或单元素数组:总是单调的
    • 所有元素相等:既是单调递增也是单调递减

代码实现

方法一:一次遍历

classSolution{/** * 判断数组是否为单调数列 * * @param nums 整数数组 * @return 如果是单调数列返回true,否则返回false * * 算法思路: * 1. 同时检测是否可能为单调递增和单调递减 * 2. 一次遍历完成检测 * 3. 提前终止优化 */publicbooleanisMonotonic(int[]nums){if(nums.length<=2){returntrue;}booleanincreasing=true;// 假设可能是单调递增booleandecreasing=true;// 假设可能是单调递减// 从第二个元素开始遍历for(inti=1;i<nums.length;i++){// 检查是否违反单调递增if(nums[i]<nums[i-1]){increasing=false;}// 检查是否违反单调递减if(nums[i]>nums[i-1]){decreasing=false;}// 提前终止:如果既不是递增也不是递减if(!increasing&&!decreasing){returnfalse;}}// 只要满足其中一个条件就是单调的returnincreasing||decreasing;}}

方法二:两次遍历

classSolution{/** * 两次遍历:分别检查递增和递减 */publicbooleanisMonotonic(int[]nums){returnisMonotonicIncreasing(nums)||isMonotonicDecreasing(nums);}/** * 检查是否为单调递增 */privatebooleanisMonotonicIncreasing(int[]nums){for(inti=1;i<nums.length;i++){if(nums[i]<nums[i-1]){returnfalse;}}returntrue;}/** * 检查是否为单调递减 */privatebooleanisMonotonicDecreasing(int[]nums){for(inti=1;i<nums.length;i++){if(nums[i]>nums[i-1]){returnfalse;}}returntrue;}}

算法分析

  • 时间复杂度:O(n)

    • 方法一:最多遍历一次数组
    • 方法二:最坏情况下遍历两次数组,平均情况可能更好
  • 空间复杂度:O(1)

    • 只使用常数额外空间

算法过程

1:nums = [1,2,2,3]

i=1: nums[1]=2 > nums[0]=1 → dec=false, inc=true i=2: nums[2]=2 == nums[1]=2 → 无变化 i=3: nums[3]=3 > nums[2]=2 → dec=false, inc=true 最终: inc=true, dec=false → return true

2:nums = [6,5,4,4]

i=1: nums[1]=5 < nums[0]=6 → inc=false, dec=true i=2: nums[2]=4 < nums[1]=5 → inc=false, dec=true i=3: nums[3]=4 == nums[2]=4 → 无变化 最终: inc=false, dec=true → return true

3:nums = [1,3,2]

i=1: nums[1]=3 > nums[0]=1 → dec=false, inc=true i=2: nums[2]=2 < nums[1]=3 → inc=false, dec=false 提前终止 → return false

4:nums = [1,1,1]

所有比较都是相等,inc和dec都保持true 最终: inc=true, dec=true → return true

测试用例

importjava.util.*;publicclassTest{publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:单调递增int[]nums1={1,2,2,3};System.out.println("Test 1: "+solution.isMonotonic(nums1));// true// 测试用例2:单调递减int[]nums2={6,5,4,4};System.out.println("Test 2: "+solution.isMonotonic(nums2));// true// 测试用例3:非单调int[]nums3={1,3,2};System.out.println("Test 3: "+solution.isMonotonic(nums3));// false// 测试用例4:所有元素相等int[]nums4={1,1,1};System.out.println("Test 4: "+solution.isMonotonic(nums4));// true// 测试用例5:单个元素int[]nums5={5};System.out.println("Test 5: "+solution.isMonotonic(nums5));// true// 测试用例6:空数组int[]nums6={};System.out.println("Test 6: "+solution.isMonotonic(nums6));// true// 测试用例7:两个元素递增int[]nums7={1,2};System.out.println("Test 7: "+solution.isMonotonic(nums7));// true// 测试用例8:两个元素递减int[]nums8={2,1};System.out.println("Test 8: "+solution.isMonotonic(nums8));// true// 测试用例9:两个元素相等int[]nums9={3,3};System.out.println("Test 9: "+solution.isMonotonic(nums9));// true// 测试用例10:长单调递增序列int[]nums10={1,2,3,4,5,6,7,8,9,10};System.out.println("Test 10: "+solution.isMonotonic(nums10));// true// 测试用例11:长单调递减序列int[]nums11={10,9,8,7,6,5,4,3,2,1};System.out.println("Test 11: "+solution.isMonotonic(nums11));// true// 测试用例12:大数值int[]nums12={Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE};System.out.println("Test 12: "+solution.isMonotonic(nums12));// true// 测试用例13:包含负数的递增序列int[]nums13={-5,-3,-1,0,2,4};System.out.println("Test 13: "+solution.isMonotonic(nums13));// true// 测试用例14:包含负数的递减序列int[]nums14={4,2,0,-1,-3,-5};System.out.println("Test 14: "+solution.isMonotonic(nums14));// true// 测试用例15:复杂的非单调序列int[]nums15={1,2,3,2,4};System.out.println("Test 15: "+solution.isMonotonic(nums15));// false}}

关键点

  1. 相等元素

    • 相等元素既不违反递增也不违反递减
  2. 提前终止

    • 一旦发现既不是递增也不是递减,立即返回
    • 避免不必要的遍历
  3. 边界情况

    • 数组长度 ≤ 2 时总是单调的
    • 所有元素相等时既是递增也是递减

常见问题

  1. 为什么不用排序后比较?

    • 排序时间复杂度 O(n log n),不如直接检测的 O(n)
    • 需要额外 O(n) 空间存储排序后的数组
  2. 要求严格单调?

    • 严格递增:nums[i] < nums[i+1]
    • 严格递减:nums[i] > nums[i+1]
    • 相等元素不再被允许
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 8:56:47

基于纳什谈判理论的风光氢多主体能源系统合作博弈与分布式求解方法

Matlab/Cplex代码&#xff1a;基于纳什谈判理论的风-光-氢多主体能源系统合作运行方法 参考电机学报的《基于纳什谈判理论的风-光-氢多主体能源系统合作运行方法》 Highlights:合作博弈(纳什谈判)&#xff0c;分布式求解(ADMM算法)最近在研究多能源系统协同优化的问题&#xff…

作者头像 李华
网站建设 2026/7/31 7:28:01

英伟达CES 2026大转向:从显卡到AI超算,看懂大模型未来!

英伟达不卖显卡了。 准确地说&#xff0c;5 年来首次在 CES 大会不发消费级显卡。没有 RTX 6090&#xff0c;没有游戏性能提升&#xff0c;没有光追演示。 黄仁勋穿着他那标志性的黑色皮夹克&#xff0c;在拉斯维加斯讲了将近两小时。黄仁勋 CES 2026 主题演讲。 他发布了下一代…

作者头像 李华
网站建设 2026/8/8 13:10:40

基于ESO与反步滑模控制的液压缸轨迹跟踪控制系统设计与AMESim仿真研究

基于ESO与反步滑模控制的液压缸轨迹跟踪控制系统设计与AMESim仿真研究 摘要 液压伺服系统因其功率密度大、响应速度快、负载刚度高等优点,被广泛应用于航空航天、重型机械、精密机床等领域。然而,其固有的非线性(如阀的流量-压力特性、油液弹性)、参数不确定性及未知的外…

作者头像 李华
网站建设 2026/7/31 5:29:23

港大突破:机器人实现稀疏记忆零样本视觉导航

这项由香港大学齐小娟教授团队与南方科技大学王忠锐教授联合开展的研究发表于2025年11月&#xff0c;论文编号为arXiv:2511.22609v1。研究团队包括王博、林杰宏、刘晨志、胡心婷、余艺霏、刘天嘉等多位研究者&#xff0c;他们共同提出了一种革命性的机器人视觉导航方法MG-Nav。…

作者头像 李华
网站建设 2026/8/7 19:08:55

springboot+vue的二手房价分析可视化系统的设计与开发_nr6h1y0i

目录 摘要内容 开发技术 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 摘要内容 该系统基于SpringBoot和Vue…

作者头像 李华
网站建设 2026/8/2 2:55:21

巨控GRM无线解决方案9,输油管道无人值守阀室远程监控与通信方案

长距离输油管线上分布着众多的线路截断阀室&#xff0c;它们对于管线安全至关重要。这些阀室通常无人值守&#xff0c;位置偏僻&#xff0c;缺乏有线网络。传统的巡检方式效率低下&#xff0c;无法实时掌握状况。采用巨控无线通讯模块及云监控平台的解决方案&#xff0c;能有效…

作者头像 李华