当前位置: 首页 > news >正文

算法通过村第三关-数组青铜笔记|单调数组

文章目录

  • 前言
  • 单调数组问题
  • 搜索插入位置:
  • 数组合并问题:
  • 总结


前言

提示:本份真诚面对自己、坦然无碍面对他人,就是优雅。

数组中的比较经典性问题:

  1. 单调数组问题
  2. 数组合并问题

单调数组问题

参考例子:896. 单调数列 - 力扣(LeetCode)
在这里插入图片描述
在这里插入图片描述
这里先思考一下:数组有序是前提,通过增/减两种状态,可以采用不同的策略。

  1. 对于所有的 i <= j 使得 a[i] <= a[j] 则说明数组 a 是单调递增的,反之,对所有的 i <= j ,使得所有的a[i] >= a[j],那么数组 a 是单调递增的。
  2. 所有遍历数组执行判断就可以解决,由于存在两种情况,我们需要两次循环就可以

展示代码🥰

 /*** 第一种方法,两次遍历确定,第一次确定是否递增 ,第二次** @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)
在这里插入图片描述
对于这个问题嘛,简单的思路就是

  1. 将nums2 添加在nums1 的后面
  2. 排序
/*** 方法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--];}}

思考一下这个代码是不是还可以优化一下💡


总结

提示:单调数组是很重要的一块,二分思想的引入。

相关文章:

算法通过村第三关-数组青铜笔记|单调数组

文章目录 前言单调数组问题搜索插入位置&#xff1a;数组合并问题&#xff1a;总结 前言 提示&#xff1a;本份真诚面对自己、坦然无碍面对他人&#xff0c;就是优雅。 数组中的比较经典性问题: 单调数组问题数组合并问题 单调数组问题 参考例子&#xff1a;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&#xff0c;而是继承了外部作用域的this...

Ubuntu ip冲突,修改静态IP方法

虚拟机克隆Ubuntu造成的IP地址相同冲突的问题_虚拟机ip冲突怎么解决_昌哥不爱晚睡的博客-CSDN博客...

windows下dll文件的创建详细教程

1、前言 dll文件是啥&#xff0c;就不作过多赘述了。现在直接教大家如何创建与使用dll文件。 本文基于windows系统&#xff0c;使用的编译相关工具为visual studio 2019。 2、创建dll 2.1 创建dll工程 首先打开visual studio&#xff0c;然后选择创建新项目&#xff0c;在搜…...

一些Git Repo

文章目录 Fake-TcpWow Fishing Script模拟券商柜台 Fake-Tcp Fake-Tcp 自己写的一个伪装包测试。 尝试把UDP的包伪装成TCP包&#xff0c;再发送到Internet Wow Fishing Script 魔兽世界钓鱼脚本 自己写的魔兽世界钓鱼脚本&#xff0c;10.0初期钓鱼成功率90%以上。现在关服了…...

【Unity脚本开源】记录鼠标按下的位置和移动的距离来进行物体的旋转,并在鼠标释放后将物体恢复到初始旋转位置

♥️作者&#xff1a;白日参商 &#x1f935;‍♂️个人主页&#xff1a;白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…...

金蝶软件实现导入Excel数据分录行信息到单据体分录行中

>>>适合KIS云专业版V16.0|KIS云旗舰版V7.0|K/3 WISE 14.0等版本<<< 金蝶软件中实现[导入Excel数据业务分录行]信息到[金蝶单据体分录]中,在采购订单|采购入库单|销售订单|销售出库单等类型单据中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地从…...

C# 11 中的新增功能

本文内容 泛型属性泛型数学支持数值 IntPtr 和 UIntPtr字符串内插中的换行符 显示另外 11 个 C# 11 中增加了以下功能&#xff1a; 原始字符串字面量泛型数学支持泛型属性UTF-8 字符串字面量字符串内插表达式中的换行符列表模式文件本地类型必需的成员自动默认结构常量 str…...

Postman通用接口加密解决方案

前言&#xff1a; 很对小伙伴对于psotman接口加密不知道如何解决&#xff0c;这里给大家出了一个全网最详细的解决方案&#xff0c;希望能帮助到大家 问题 postman内置加密Api&#xff0c;但不支持RSA加解密码。如何用postman进入rsa加解密&#xff1f;postman中request对象…...

java,钉钉小程序免密登录

一、开发者后台统一登录 - 钉钉统一身份认证 登录钉钉开放平台 二、教程介绍 如何实现用户免登。免登是指用户进入应用后&#xff0c;无需输入钉钉用户名和密码&#xff0c;应用程序可自动获取当前用户身份&#xff0c;进而登录系统的流程。 三、准备工作 注册了钉钉管理员…...

基于docker部署的Selenium Grid分布式自动化测试

01、什么是Selenium Grid Selenium Grid是Selenium套件的一部分&#xff0c;它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上。 Selenium Grid有两个版本——老版本Grid 1和新版本Grid 2。我们只对新版本做介绍&#xff0c;因为Selenium团队已经逐渐遗弃老版…...

目标和——力扣494

文章目录 题目描述解法:动态规划题目描述 解法:动态规划 nt findTargetSumWays(vector<int>& nums, int target){int sum...

sql 执行的顺序

在执行 SQL 查询时&#xff0c;通常会按照以下顺序进行处理&#xff1a; FROM 子句&#xff1a;指定要查询的表或视图。WHERE 子句&#xff1a;筛选满足特定条件的行。GROUP BY 子句&#xff1a;将结果按照指定的列进行分组。HAVING 子句&#xff1a;筛选满足特定条件的分组。…...

TCP收发信息(C++)

目录 一、介绍 二、收数据 三、发数据 一、介绍 tcp和udp的区别之一&#xff0c;即tcp是有连接的&#xff0c;udp是无连接的&#xff0c;udp收发数据的代码可以独立运行&#xff0c;tcp发数据前必须确保收数据的一方是打开的&#xff0c;否则无法建立连接。 二、收数据 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解决方案

中国作为全球除美国外最大的消费市场&#xff0c;是几乎每个国际化企业都想要深入挖掘的市场&#xff0c;但外国企业在中国开展在线业务需要面临一个比较特殊的挑战&#xff1a;互联网防火墙&#xff08;GFW&#xff09;。为此所有想要在中国市场有所作为的外企都需要首先解决这…...

室内UWB定位到达角(AOA)测量精度的提高

抽象的 本文表明,用于在视线 (LoS) 中定位标签的干涉定位系统的方位角测量精度可以通过利用脉冲无线电超宽带 (IR-UWB) 信号来提高,并且无需增加频率带宽。该解决方案采用相位相关 (PC) 方法,最初应用于连续波 (CW) 信号,后来适用于超宽带 (UWB) 脉冲信号。将获得的结果与…...

“深入理解JVM:探索Java虚拟机的内部工作原理“

标题&#xff1a;深入理解JVM&#xff1a;探索Java虚拟机的内部工作原理 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部工作原理&#xff0c;包括JVM的架构、类加载、内存管理、垃圾回收机制等方面。通过理解JVM的内部工作原理&#xff0c;我们…...

TC3XX - MCAL知识点(三十一):FlsLoader MCAL配置及代码实战

目录 1、概述 2、MCAL配置 2.1、FlsLoaderGeneral 2.2、FlsLoaderOptionalApi 2.3、FlsLoaderPFlash0ProtConfig 3、测试代码及结果 3.1、测试代码 3.1.1、初始化 3....

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...

从0开始学习R语言--Day17--Cox回归

Cox回归 在用医疗数据作分析时&#xff0c;最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据&#xff0c;往往会有很多的协变量&#xff0c;即使我们通过计算来减少指标对结果的影响&#xff0c;我们的数据中依然会有很多的协变量&#xff0c;且…...

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总...

多模态学习路线(2)——DL基础系列

目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization&#xff08;RMSNorm&#xff09; 二、激活函数 1. Sigmoid激活函数&#xff08;二分类&…...