算法题 单调数列

单调数列

问题描述

如果数组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]
    • 相等元素不再被允许

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1124733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯西雅图AI实验室突破:1%人工数据实现等效20倍数据训练

这项由腾讯西雅图AI实验室的余文豪博士领导的研究于2025年12月发表在arXiv预印本平台&#xff0c;论文编号为arXiv:2512.02472v1。研究团队还包括来自华盛顿大学圣路易斯分校的研究人员。这项研究在AI自我进化领域取得了重要突破&#xff0c;为人工智能的自主学习开辟了新的道路…

基于FPGA的DDS信号发生器:探索数字信号生成的奇妙之旅

基于FPGA的DDS信号发生器任意信号发生器&#xff0c;实物VerilogVHDL 本设计是在FPGA开发板上实现一个DDS信号发生器&#xff0c;输出波形有正弦波、方波、三角波和锯齿波等&#xff0c;输出波形频率范围0到20MHZ可调&#xff0c;波形最大幅度在0到5V之间可调&#xff0c;相位也…

Stable Diffusion 3.0:开启企业专属品牌视觉模型新时代

一、引言 在当今 AI 绘画领域,Stable Diffusion 3.0 凭借其强大的性能和广泛的应用,已然成为了众多开发者和企业关注的焦点。它基于先进的深度学习算法,能够根据用户输入的文本描述,生成高质量、多样化的图像,在艺术创作、设计、影视等诸多行业展现出巨大的价值。从艺术创…

AI搜索文献:高效精准的学术资源检索与获取新方法探讨

一、WisPaper&#xff1a;智能学术搜索激发科研灵感 科研创新的关键是了解前沿&#xff0c;找到突破口。但传统查文献方式往往效率低&#xff1a; Google Scholar 或 arXiv 搜索结果太多&#xff0c;难以筛选公众号推送滞后&#xff0c;容易错过最新研究文献阅读时间长&#…

中科院突破:虚拟仿真实现自动驾驶真车驾驶训练

这项由中国科学院自动化研究所的田浩晨领导的研究团队&#xff0c;联合香港大学和小米汽车等机构完成的研究发表于2025年11月的arXiv预印本平台&#xff0c;论文编号为arXiv:2511.23369v1。对这项突破性研究感兴趣的读者可以通过该编号查询完整论文内容。 想象这样一个场景&…

中科大团队突破性解决视觉语言动作模型的视野局限

这项由中国人民大学、北京大学、香港中文大学联合开展的研究发表于2024年11月&#xff0c;论文编号为arXiv:2511.19433v1。研究团队由董靖、王钢、刘佳琪、唐维亮、孙泽龙、姚云超、魏振宇、刘云辉、陆志武、丁明宇等学者组成&#xff0c;他们首次系统性地解决了视觉语言动作模…

【Java毕设源码分享】基于springboot+vue的产品订单管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

基于springboot框架的服装商城销售系统_0895i6w5

目录 系统概述技术架构核心功能扩展性与安全 开发技术 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述…

知识管理工具又添新锐,notion vs sward一文对比解析

Notion是一款很有影响力的全功能协作工具&#xff0c;以简洁易用著称&#xff0c;而 sward 作为一款新兴的开源知识管理工具&#xff0c;也凭借其轻量、支持一键安装、界面简洁易用等特点吸引了众多关注。那么&#xff0c;在实际工作场景中&#xff0c;哪一款工具更符合团队需求…

项目管理工具又添新锐,MantisBT vs Kanass一文对比解析

MantisBT是一款偏缺陷管理的项目工具&#xff0c;kanass是一款国产开源且免费的项目管理工具&#xff0c;包含项目、项目集、产品、工时、计划等功能模块。本文将从功能、用户体验、集成能力等方面对比二者&#xff0c;助力团队选择合适的工具。1、安装部署对比项MantisBTkanas…

全栈式智慧园区管理系统:技术架构、场景落地与效能革新

当传统园区还困于 “人工巡检效率低、设备故障响应慢、空间资源调度乱” 的痛点时&#xff0c;以物联网、数字孪生、边缘计算为核心的智慧园区管理系统&#xff0c;正成为城市产业载体升级的核心引擎。YUNMELL 云迈科技推出的全栈式智慧园区管理系统&#xff0c;通过 “项目空间…

Linux的PS1 配置示例

这个 PS1 配置包含多个部分&#xff0c;让我详细分解&#xff1a;整体结构分析\[\e]0;\u\h: \w\a\]${debian_chroot:($debian_chroot)}\[\033[01;32m\]\u\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$1. 第一部分&#xff1a;终端标题设置\[\e]0;\u\h: \w\a\]\[\e]0; 开始设…

导师严选9个AI论文软件,专科生搞定毕业论文+格式规范!

导师严选9个AI论文软件&#xff0c;专科生搞定毕业论文格式规范&#xff01; AI 工具如何成为专科生毕业论文的得力助手 随着人工智能技术的不断发展&#xff0c;AI 工具在学术写作中的应用越来越广泛。对于专科生来说&#xff0c;撰写一篇符合格式规范、内容严谨的毕业论文是一…

springboot+vue+Mysql的学生信息管理系统设计_xu1v7aa3

目录系统架构设计功能模块划分数据库设计技术实现细节系统特色与优化开发技术核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式…

知识管理工具又添新锐,语雀 vs sward一文对比解析

语雀是一款页面简洁且易用的知识管理工具&#xff0c;而 Sward 作为一款新兴的开源知识管理工具&#xff0c;也凭借其轻量、支持一键安装、界面简洁易用等特点吸引了众多关注。本文将从功能特性、操作体验等多个维度进行逐一对比&#xff0c;以期为团队在工具选型时提供参考依据…

‌2026年新兴性能测试技术:面向云原生与AI原生时代的质量范式重构

作为2026年开年之际的软件测试从业者&#xff0c;你正站在一场深刻变革的交汇点上。性能测试已不再是“压测脚本监控图表”的简单组合&#xff0c;而是演变为融合AI决策、数字孪生仿真、体验量化与工程自动化的新质量基础设施。‌1. AI原生测试&#xff08;AICT&#xff09;&am…

香港科技大学:让AI摄像师精准控制视角,深度信息成为关键武器

这项由香港科技大学&#xff08;广州&#xff09;张洪飞、陈康昊等研究团队完成的突破性研究&#xff0c;发表于2025年的计算机视觉与模式识别会议&#xff08;CVPR&#xff09;&#xff0c;论文编号为arXiv:2511.23127v2。研究团队还包括来自复旦大学、深圳大学等多所知名学府…

高能分享:软件测试十大必问面试题(附带答案)

1 介绍之前负责的项目 参考答案&#xff1a;先大概描述一下这个项目是做什么的&#xff08;主要功能&#xff09;&#xff0c;包括哪些模块&#xff0c;是什么架构的&#xff08;B/S、C/S、移动端&#xff1f;&#xff09;&#xff0c;你在其中负责哪些模块的测试。期间经历了…

nginx解决跨域问题,包括options请求的跨域问题

C:\tools\nginx-1.28.0\conf\nginx.conf文件&#xff0c;报错&#xff1a;Access to fetch at http://localhost/api-aa2-agent12/classes/courses from origin http://localhost:3001 has been blocked by CORS policy: Response to preflight request doesnt pass access con…

北京大学研究团队:音视频联合训练提升AI多模态理解力

北京大学计算机学院的吴建宗团队联合阿里巴巴集团&#xff0c;在2025年12月发表了一项颠覆性的研究成果。这项名为"Does Hearing Help Seeing? Investigating Audio–Video Joint Denoising for Video Generation"的研究首次系统性地证明了一个令人惊奇的发现&#…