算法通过村第三关-数组青铜笔记|单调数组
文章目录
- 前言
- 单调数组问题
- 搜索插入位置:
- 数组合并问题:
- 总结
前言
提示:本份真诚面对自己、坦然无碍面对他人,就是优雅。
数组中的比较经典性问题:
- 单调数组问题
- 数组合并问题
单调数组问题
参考例子:896. 单调数列 - 力扣(LeetCode)


这里先思考一下:数组有序是前提,通过增/减两种状态,可以采用不同的策略。
- 对于所有的 i <= j 使得 a[i] <= a[j] 则说明数组 a 是单调递增的,反之,对所有的 i <= j ,使得所有的a[i] >= a[j],那么数组 a 是单调递增的。
- 所有遍历数组执行判断就可以解决,由于存在两种情况,我们需要两次循环就可以
展示代码🥰
/*** 第一种方法,两次遍历确定,第一次确定是否递增 ,第二次** @param nums* @return*/public static boolean isMonotonic(int[] nums) {return isSorted(nums, true) || isSorted(nums, false);}public static boolean isSorted(int[] nums, boolean increasing) {int n = nums.length;for (int i = 0; i < n - 1; ++i) {if(increasing){ // 增 if (nums[i] > nums[i + 1]) {return false;}}else{if (nums[i] < nums[i + 1]) {return false;}}}return true;}
当然这样写是可以通过测试的,但是显得有点繁琐了😁,需要遍历两次,想一下这里需要怎么优化呢💡
我们关注一下 i 和 i + 1出现的位置 nums[i] > nums[i + 1], 而在另外的一个地方 j 和 j + 1 出现的位置nums[j] < num[j + 1],那是不是说明就是单调的?这样的化我们可以使用两个变量标记一下,代码如下:
/*** 第二种方式,一次遍历确定*如果是递增的就一定不能出现递减的相邻元素,* 如果出现递减的就一定不能出现递增的相邻元素。* @param nums* @return*/public static boolean isMonotonic_2(int[] nums) {boolean des = true, inc = true;int n = nums.length;for (int i = 0; i < n - 1; i++) {if (nums[i] > nums[i + 1]) {inc = false;}if (nums[i] < nums[i + 1]) {des = false;}}return des || inc;}
技巧:两元式结果的特殊处理,|| 运算的运用。
搜索插入位置:
数组单调性,是一个重要的信息,很多时候要将特定的元素插入到有序序列,并且保证插入后的顺序依然有序,比如力扣的 35 题:35. 搜索插入位置 - 力扣(LeetCode)


这个问题让我们将元素位置返回,比较简单,只需要遍历一边数组就可以找到答案。当然想这样的问题,如何快速的寻找目标元素,我们需要有 二分的概念。以后但凡遇到单调序列中查找的情况,脑海中马上想到二分,迅速反应。
题解:
class Solution {public int searchInsert(int[] nums, int target) {int n = nums.length;for(int i = 0; i < n; i++){if(nums[i] >= target){return i;}}// 出现再最后一个return n;}
}
这里贴一下代码提供思考💡( 二分思想)
public static int searchInsert(int[] nums, int target) {// 拿到 数组长度int n = nums.length;// 确定左右int left = 0, right = n - 1, ans = n;while(left <= right){// 思考这里问什么是 小于等于// 确定 中间值int mid = (right - left) / 2 + left;if (nums[mid] >= target){ans = mid;right = mid - 1;}else {left = mid + 1;}}return ans;}
数组合并问题:
数组合并是将两个或者多个有序数组合并成一个新的数组。当然这个问题本事不是很难,但是要写的出彩,确实需要花费一些功夫的,这个问题也是比较经典的问题。
先来看看力扣 88 题,88. 合并两个有序数组 - 力扣(LeetCode)

对于这个问题嘛,简单的思路就是
- 将nums2 添加在nums1 的后面
- 排序
/*** 方法1:先合并再排序实现排序** @param nums1 第一个数组* @param nums1_len 第一个数组的长度* @param nums2 第二个数组,将nums2合并到nums1中* @param nums2_len 第二个数组的长度*/public static void merge1(int[] nums1, int nums1_len, int[] nums2, int nums2_len) {for (int i = 0; i < nums2_len; i++) {nums1[nums1_len + i] = nums2[i];}Arrays.sort(nums1);}
当然这样写太没有技术含量了,面试官也不喜欢。这道题的关键是将nums2合并到nums1 中并且还要保证有序。因为nums1是数组不能强行插入。如果从前面向后面出插入,数组nums1后面的元素会多次移动,代价太高了。此时再借助一个数组就可以解决这个问题 ans,把选好的数组元素放入ans中,最后返回,很好的解决以上为题。
这样的化面试官会接着向下考察:可以优化一下,或者不申请数组。(专业的说法是,空间复杂度O(n),可以采用O(1)的方法实现?
比较好的方式从后向前插入,nums1 和 nums2 的元素是固定的,所以排序后最远位置一定是nums1 和 nums2 中最大的那一个,一次类推,每次找最大的,就可以实现从后向前填了,展示一下代码:
/*** 方法2:两个数组从后向前逐步合并** @param nums1* @param nums1_len* @param nums2* @param nums2_len*/public static void merge2(int[] nums1, int nums1_len, int[] nums2, int nums2_len) {int n = nums1_len + nums2_len - 1;int len_1 = nums1_len - 1, len_2 = nums2_len - 1;while (len_1 >= 0 && len_2 >= 0){if (nums1[len_1] >= nums2[len_2]){nums1[n--] = nums1[len_1--];}else if (nums1[len_1] < nums2[len_2]){nums1[n--] = nums2[len_2--];}}// 有剩余while(len_1 != -1){nums1[n--] = nums1[len_1--];}while(len_2 != -1){ // 为甚是-1nums1[n--] = nums2[len_2--];}}
思考一下这个代码是不是还可以优化一下💡
总结
提示:单调数组是很重要的一块,二分思想的引入。
相关文章:
算法通过村第三关-数组青铜笔记|单调数组
文章目录 前言单调数组问题搜索插入位置:数组合并问题:总结 前言 提示:本份真诚面对自己、坦然无碍面对他人,就是优雅。 数组中的比较经典性问题: 单调数组问题数组合并问题 单调数组问题 参考例子:896. 单调数列…...
Springboot MultipartFile文件上传与下载
yml文件配置是否可以上传及上传附件大小 servlet:multipart:# 允许文件上传enabled: true# 单个文件大小max-file-size: 20MB# 设置总上传的文件大小max-request-size: 50MB /*** param files* param request* Description 上传文件* Throws* Return java.util.List* Date 202…...
js this变量
js this变量 有个比较特殊的箭头函数没有自己的this,而是继承了外部作用域的this...
Ubuntu ip冲突,修改静态IP方法
虚拟机克隆Ubuntu造成的IP地址相同冲突的问题_虚拟机ip冲突怎么解决_昌哥不爱晚睡的博客-CSDN博客...
windows下dll文件的创建详细教程
1、前言 dll文件是啥,就不作过多赘述了。现在直接教大家如何创建与使用dll文件。 本文基于windows系统,使用的编译相关工具为visual studio 2019。 2、创建dll 2.1 创建dll工程 首先打开visual studio,然后选择创建新项目,在搜…...
一些Git Repo
文章目录 Fake-TcpWow Fishing Script模拟券商柜台 Fake-Tcp Fake-Tcp 自己写的一个伪装包测试。 尝试把UDP的包伪装成TCP包,再发送到Internet Wow Fishing Script 魔兽世界钓鱼脚本 自己写的魔兽世界钓鱼脚本,10.0初期钓鱼成功率90%以上。现在关服了…...
【Unity脚本开源】记录鼠标按下的位置和移动的距离来进行物体的旋转,并在鼠标释放后将物体恢复到初始旋转位置
♥️作者:白日参商 🤵♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油!…...
金蝶软件实现导入Excel数据分录行信息到单据体分录行中
>>>适合KIS云专业版V16.0|KIS云旗舰版V7.0|K/3 WISE 14.0等版本<<< 金蝶软件中实现[导入Excel数据业务分录行]信息到[金蝶单据体分录]中,在采购订单|采购入库单|销售订单|销售出库单等类型单据中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地从…...
C# 11 中的新增功能
本文内容 泛型属性泛型数学支持数值 IntPtr 和 UIntPtr字符串内插中的换行符 显示另外 11 个 C# 11 中增加了以下功能: 原始字符串字面量泛型数学支持泛型属性UTF-8 字符串字面量字符串内插表达式中的换行符列表模式文件本地类型必需的成员自动默认结构常量 str…...
Postman通用接口加密解决方案
前言: 很对小伙伴对于psotman接口加密不知道如何解决,这里给大家出了一个全网最详细的解决方案,希望能帮助到大家 问题 postman内置加密Api,但不支持RSA加解密码。如何用postman进入rsa加解密?postman中request对象…...
java,钉钉小程序免密登录
一、开发者后台统一登录 - 钉钉统一身份认证 登录钉钉开放平台 二、教程介绍 如何实现用户免登。免登是指用户进入应用后,无需输入钉钉用户名和密码,应用程序可自动获取当前用户身份,进而登录系统的流程。 三、准备工作 注册了钉钉管理员…...
基于docker部署的Selenium Grid分布式自动化测试
01、什么是Selenium Grid Selenium Grid是Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上。 Selenium Grid有两个版本——老版本Grid 1和新版本Grid 2。我们只对新版本做介绍,因为Selenium团队已经逐渐遗弃老版…...
目标和——力扣494
文章目录 题目描述解法:动态规划题目描述 解法:动态规划 nt findTargetSumWays(vector<int>& nums, int target){int sum...
sql 执行的顺序
在执行 SQL 查询时,通常会按照以下顺序进行处理: FROM 子句:指定要查询的表或视图。WHERE 子句:筛选满足特定条件的行。GROUP BY 子句:将结果按照指定的列进行分组。HAVING 子句:筛选满足特定条件的分组。…...
TCP收发信息(C++)
目录 一、介绍 二、收数据 三、发数据 一、介绍 tcp和udp的区别之一,即tcp是有连接的,udp是无连接的,udp收发数据的代码可以独立运行,tcp发数据前必须确保收数据的一方是打开的,否则无法建立连接。 二、收数据 tc…...
windows Socket简单编程实例
服务端 #include <winsock2.h> #include <string.h> #include <stdio.h> #include <stdlib.h>#pragma comment(lib, "Ws2_32.lib")void error_handing(const char* message) {fputs(message, stderr);fputc(\n, stderr);exit(1); } int mai…...
外企开展中国在线业务的三种网络加速方案:含免ICP备案CDN解决方案
中国作为全球除美国外最大的消费市场,是几乎每个国际化企业都想要深入挖掘的市场,但外国企业在中国开展在线业务需要面临一个比较特殊的挑战:互联网防火墙(GFW)。为此所有想要在中国市场有所作为的外企都需要首先解决这…...
室内UWB定位到达角(AOA)测量精度的提高
抽象的 本文表明,用于在视线 (LoS) 中定位标签的干涉定位系统的方位角测量精度可以通过利用脉冲无线电超宽带 (IR-UWB) 信号来提高,并且无需增加频率带宽。该解决方案采用相位相关 (PC) 方法,最初应用于连续波 (CW) 信号,后来适用于超宽带 (UWB) 脉冲信号。将获得的结果与…...
“深入理解JVM:探索Java虚拟机的内部工作原理“
标题:深入理解JVM:探索Java虚拟机的内部工作原理 摘要:本文将深入探索Java虚拟机(JVM)的内部工作原理,包括JVM的架构、类加载、内存管理、垃圾回收机制等方面。通过理解JVM的内部工作原理,我们…...
TC3XX - MCAL知识点(三十一):FlsLoader MCAL配置及代码实战
目录 1、概述 2、MCAL配置 2.1、FlsLoaderGeneral 2.2、FlsLoaderOptionalApi 2.3、FlsLoaderPFlash0ProtConfig 3、测试代码及结果 3.1、测试代码 3.1.1、初始化 3....
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
