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

每日算法一练:剑指offer——数组篇(6)

1.点名

        某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席,请返回他的学号。

示例 1:

输入: records = [0,1,2,3,5]
输出: 4

示例 2:

输入: records = [0, 1, 2, 3, 4, 5, 6, 8]
输出: 7

提示:

1 <= records.length <= 10000

1.1二分法查找

        这是一个缺失数问题,在给定的升序数组 records 中找出缺席同学的学号。数组 records 是由班级同学的学号组成的,其中学号从 0 开始,逐个递增,仅有一位同学缺席。要找出缺席的学号,我们可以借助 二分查找 的方法快速定位缺失位置。

解题思路

因为记录是升序的学号列表,仅有一位学号缺失,可以推断:

  • 如果数组中没有缺失数字,那么 records[i] 应等于 i(即每个索引位置的值与其索引相等)。
  • 如果某个数字缺失,则从缺失位置开始,数组中的元素不再满足 records[i] = i 关系,而是比其索引值大 1。因此,我们可以利用这一规律进行查找。

算法解析

使用二分查找的方式,我们可以在对数时间复杂度 O(log n) 下找到缺失的学号:

  1. 初始化左右指针:将 i 设为 0(左指针),j 设为 records.length - 1(右指针),用于二分查找。
  2. 循环查找:在 i <= j 的条件下,不断收缩查找范围。
    • 计算中间位置 m = (i + j) / 2
    • 检查 records[m] 的值:
      • 如果 records[m] == m:说明前面没有缺失元素(当前索引 m 位置的值是正确的),所以缺失的学号在右半部分。将 i 设为 m + 1,向右搜索。
      • 如果 records[m] != m:说明缺失学号在左半部分(从当前 m 位置开始有不匹配的情况)。将 j 设为 m - 1,向左搜索。
  3. 结束循环:当 i 大于 j 时,循环结束,缺失的学号即为 i

最终,i 的位置就是缺失学号的位置。

复杂度分析

  • 时间复杂度:二分查找使得时间复杂度为 O(log n),适用于数据规模较大的情况。
  • 空间复杂度:仅使用常数级别的额外空间,空间复杂度为 O(1)

代码示例:

class Solution {public int takeAttendance(int[] records) {// 初始化左右指针int i = 0, j = records.length - 1;// 使用二分查找寻找缺失的学号while(i <= j) {// 计算中间位置 mint m = (i + j) / 2;// 判断中间位置 m 是否与学号对应if(records[m] == m) {// 如果 records[m] == m,说明左侧都正常匹配,缺失学号在右侧i = m + 1; // 将左指针移到右半部分} else {// 如果 records[m] != m,说明缺失学号在左半部分j = m - 1; // 将右指针移到左半部分}}// 最终 i 的位置即为缺失的学号return i;}
}

2.查找总价值为目标值的两个商品

        购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

示例 1:

输入:price = [3, 9, 12, 15], target = 18
输出:[3,15] 或者 [15,3]

示例 2:

输入:price = [8, 21, 27, 34, 52, 66], target = 61
输出:[27,34] 或者 [34,27]

提示:

  • 1 <= price.length <= 10^5
  • 1 <= price[i] <= 10^6
  • 1 <= target <= 2*10^6

2.1双指针检索

这是一个典型的双指针问题,因为数组 price 已经是升序排列,所以可以使用双指针快速查找两个数的和为 target 的组合。下面是解题思路、算法流程及复杂度分析。

解题思路

  1. 双指针:从数组的两端开始,逐步缩小范围,利用排序数组的特性进行查找。

    • 若两个指针指向的元素之和小于 target,则需要更大的和,因此将左指针右移。
    • 若和大于 target,则需要更小的和,因此将右指针左移。
    • 当和等于 target 时,找到解。
  2. 提前返回:找到符合条件的两个数后,立即返回结果数组 [price[i], price[j]],这样可以保证时间效率。

算法解析

  1. 初始化:定义两个指针 ij,分别指向数组的首尾位置。
  2. 循环条件:在 i < j 的条件下进行迭代:
    • 计算 price[i] + price[j] 的和 s
    • 比较 starget
      • 如果 s == target,返回 [price[i], price[j]]
      • 如果 s < target,左指针 i 右移,增加和的值。
      • 如果 s > target,右指针 j 左移,减小和的值。
  3. 返回结果:若循环结束仍未找到,则返回空数组 []

复杂度分析

  • 时间复杂度O(N),其中 N 为数组 price 的长度。双指针仅需线性遍历一次数组。
  • 空间复杂度O(1),仅使用了常数级的额外空间。

代码示例:

class Solution {public int[] twoSum(int[] price, int target) {// 初始化左右指针int i = 0, j = price.length - 1;// 使用双指针查找两个和为 target 的数while (i < j) {// 计算当前左右指针指向元素的和int s = price[i] + price[j];// 判断当前和 s 是否等于目标 targetif (s < target) {// 若 s 小于 target,说明和偏小,需要增大和// 将左指针右移i++;} else if (s > target) {// 若 s 大于 target,说明和偏大,需要减小和// 将右指针左移j--;} else {// 若 s 等于 target,找到符合条件的组合,立即返回return new int[] { price[i], price[j] };}}// 若未找到符合条件的组合,返回空数组return new int[0];}
}

3.文件组合

        待传输文件被切分成多个部分,按照原排列顺序,每部分文件编号均为一个 正整数(至少含有两个文件)。传输要求为:连续文件编号总和为接收方指定数字 target 的所有文件。请返回所有符合该要求的文件传输组合列表。

注意,返回时需遵循以下规则:

  • 每种组合按照文件编号 升序 排列;
  • 不同组合按照第一个文件编号 升序 排列。

示例 1:

输入:target = 12
输出:[[3, 4, 5]]
解释:在上述示例中,存在一个连续正整数序列的和为 12,为 [3, 4, 5]。

示例 2:

输入:target = 18
输出:[[3,4,5,6],[5,6,7]]
解释:在上述示例中,存在两个连续正整数序列的和分别为 18,分别为 [3, 4, 5, 6] 和 [5, 6, 7]。

提示:

  • 1 <= target <= 10^5

3.1滑动窗口

        这是一个寻找连续正整数序列的和等于指定目标值 target 的问题。我们可以使用双指针滑动窗口的方法来高效地查找所有符合条件的组合。下面是解题思路、算法流程和复杂度分析。

解题思路

  1. 双指针法:使用两个指针 ij 来表示当前正在考虑的连续正整数的起始和结束位置。
  2. 序列和的计算:维护一个当前和 s,初始为 3(即 1 + 2),表示 i=1j=2 的和。
  3. 遍历和调整
    • 如果当前和 s 等于目标 target,则记录下当前的连续整数序列。
    • 如果当前和 s 大于或等于目标 target,则通过移动左指针 i 来减小和。
    • 如果当前和 s 小于目标 target,则通过移动右指针 j 来增大和。

算法流程

  1. 初始化

    • i1,表示当前序列的起始位置。
    • j2,表示当前序列的结束位置。
    • s3,即 ij 所指元素的和。
    • 使用一个列表 res 来存储符合条件的组合。
  2. 双指针循环

    • i 小于 j 时进行循环:
      • 如果 s 等于 target,记录下从 ij 的连续整数。
      • 如果 s 大于或等于 target,将 s 减去 i 并将 i 右移。
      • 如果 s 小于 target,将 j 右移,并更新 s
  3. 返回结果

    • 将列表 res 转换为二维数组返回。

复杂度分析

  • 时间复杂度O(N),其中 N 是目标 target 的值。双指针会遍历连续的正整数并调整,整体复杂度为线性。
  • 空间复杂度O(M),其中 M 是存储符合条件组合的个数。由于使用了额外的列表来存储结果,空间复杂度为线性。
import java.util.ArrayList;
import java.util.List;class Solution {public int[][] fileCombination(int target) {// 初始化双指针int i = 1, j = 2, s = 3; // s 为当前连续正整数和List<int[]> res = new ArrayList<>(); // 存储结果// 双指针查找while (i < j) {if (s == target) {// 找到符合条件的组合,记录下当前的连续正整数int[] ans = new int[j - i + 1];for (int k = i; k <= j; k++)ans[k - i] = k; // 填充组合res.add(ans); // 添加到结果列表}// 调整指针if (s >= target) {s -= i; // 减去左边的数字i++; // 左指针右移} else {j++; // 右指针右移s += j; // 增加右边的数字}}// 返回结果数组return res.toArray(new int[0][]);}
}

相关文章:

每日算法一练:剑指offer——数组篇(6)

1.点名 某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席&#xff0c;请返回他的学号。 示例 1: 输入: records [0,1,2,3,5] 输出: 4示例 2: 输入: records [0, 1, 2, 3, 4, 5, 6, 8] 输出: 7提示&#xff1a; 1 < records.le…...

【环境搭建】Apache ZooKeeper 3.8.4 Stable

软件环境 Ubuntu 20.04 、OpenJDK 11 OpenJDK 11&#xff08;如果已经安装&#xff0c;可以跳过这一步&#xff09; 安装OpenJDK 11&#xff1a; $ sudo apt-get update$ sudo apt-get install -y openjdk-11-jdk 设置 JAVA_HOME 环境变量&#xff1a; $ sudo gedit ~/.bash…...

算法练习——双指针

前言&#xff1a;大佬写博客给别人看&#xff0c;菜鸟写博客给自己看&#xff0c;我是菜鸟。 学前须知&#xff08;对自己&#xff09;&#xff1a;这里的指针不一定指地址&#xff01;也可能是数组下标。 1&#xff1a;移动零(双指针) 题目要求&#xff1a; 解题思路&#x…...

vue中el-table显示文本过长提示

1.el-table设置轻提示:show-overflow-tooltip“true“&#xff0c;改变轻提示宽度...

JS 字符串拼接并去重

1、includes 循环数组将某个字段拼接成新的字符串并去重&#xff08;数组里面包含的一个对象&#xff0c;或者其他都OK&#xff09; // 定义一个数组 let arr[.......] // 定义拼接的字符串 let a //循环数组将里面某个字段拼接在一起并去重 arr.forEach(item > {if(!a.in…...

opencv 图像预处理

图像预处理 ​ 在计算机视觉和图像处理领域&#xff0c;图像预处理是一个重要的步骤&#xff0c;它能够提高后续处理&#xff08;如特征提取、目标检测等&#xff09;的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法&#xff0c;以下是一些常见的图像预处理操作&…...

SAP B1 功能模块字段介绍 - 价格清单(下)

目录 背景 五、业务伙伴的特殊价格 1. 单据逻辑功能 2. 部分字段解释 3. 操作流程 3.1 时间相关 3.2 数量相关 4. 实例 六、复制特殊价格到选择标准 1. 单据逻辑功能 2. 部分字段解释 七、全局更新特殊价格 ​编辑 1. 单据逻辑功能 2. 部分字段解释 八、价格更…...

传智杯 第六届-复赛-D

题目描述&#xff1a; 小红定义两个字符串同构&#xff0c;当且仅当对于i∈[1,n],b[i]−a[i]i∈[1,n],b[i]-a[i]i∈[1,n],b[i]−a[i]是定值。例如&#xff0c;"bacd"和"edfg"是同构的。 现在小红拿到了一个长度为n的字符串a&#xff0c;她想知道&a…...

Java - 数组实现大顶堆

题目描述 实现思路 要实现一个堆&#xff0c;我们首先要了解堆的概念。 堆是一种完全二叉树&#xff0c;分为大顶堆和小顶堆。 大顶堆&#xff1a;每个节点的值都大于或等于其子节点的值。 小顶堆&#xff1a;每个节点的值都小于或等于其子节点的值。 完全二叉树&#xff…...

ifuse挂载后,在python代码中访问iOS沙盒目录获取app日志

上一次使用pymobiledevice3&#xff0c;在python代码中访问app的沙盒目录并分析业务日志&#xff0c;在使用过程中发现&#xff0c;在获取app日志的时候速度很慢&#xff0c;执行时间很长&#xff0c;需要30-61秒&#xff0c;所以这次尝试使用libimobiledevic和ifuse&#xff0…...

Windows WSL环境下安装 pytorch +ROCM 支持AMD显卡

官方文档&#xff1a;Install PyTorch for ROCm — Use ROCm on Radeon GPUs 一、操作系统及驱动 windows 下安装WSL 环境( windows subsystem for Linux), 安装ubuntu 22.04环境。 安装 rocm 软件包&#xff1a; sudo apt update wget https://repo.radeon.com/amdgpu-insta…...

uniapp中skymap.html(8100端口)提示未登录的排查与解决方法

问题&#xff1a; 目前账号已经登录&#xff0c;uniapp的其他端口均可以访问到数据&#xff0c;唯独skymap.html中的8100会提示未登录。&#xff08;8100是后端网关gateway端口&#xff09; 分析&#xff1a; 在 skymap.html 中遇到未登录提示的问题&#xff0c;通常是由于该…...

训练模型时梯度出现NAN或者INF(禁用amp的不同level)

判断参数梯度位nan或inf的代码&#xff1a; for name, param in model.named_parameters():if param.grad is not None:if torch.isnan(param.grad).any() or torch.isinf(param.grad).any():print(f"grad layer [{name}] is NaN or Inf") 首先来说可能得原因&…...

Maven核心概念

一、项目对象模型&#xff08;POM&#xff09; 1. 定义 POM&#xff08;Project Object Model&#xff09;是 Maven 项目的核心配置文件&#xff0c;它以 XML 格式描述了项目的基本信息、项目依赖、构建配置等。可以说&#xff0c;POM 是 Maven 理解和处理项目的基础。 2. 基…...

Sonatype Nexus 部署手册

文章目录 一、前言二、软件环境2.1 版本变更&#xff1a;2.1.1 变更存储的原因2.2.2 H2作为存储的注意点 三、资源配置四、开始部署4.1 部署jdk174.2 离线部署nexus4.2.1 下载4.2.2 部署1. 上传到服务器2. 解压3. 添加用户4. 修改启动参数5. 迁移sonatype-work &#xff0c;并授…...

TLV320AIC3104IRHBR 数据手册 一款低功耗立体声音频编解码器 立体声耳机放大器芯片麦克风

TLV320AIC3104 是一款低功耗立体声音频编解码器&#xff0c;具有立体声耳机放大器以及在单端或全差分配置下可编程的多个输入和输出。该器件包括基于寄存器的全面电源控制&#xff0c;可实现立体声 48kHz DAC 回放&#xff0c;在 3.3V 模拟电源电压下的功耗低至 14mW&#xff0…...

(8)结构体、共用体和枚举类型数据

1. 结构体、共用体的定义及区别,typedef 定义别名 结构体的定义 结构体是一种用户自定义的数据类型,它可以将不同类型的数据组合在一起。例如,定义一个表示学生信息的结构体: // 定义结构体类型 struct Student struct Student {char name[20];int age;float score; };共…...

Jedis操作和springboot整合redis

Jedis-springboot整合redis Jedis 引入jedis依赖 注意事项 测试相关数据类型 Key String List set hash zset 案例 spring boot整合redis 引入相关依赖 在application.properties中配置redis 配置 创建redis配置类 创建测试类 Jedis 引入jedis依赖 <depen…...

基于AI大模型的复杂扫描件PDF信息提取与规整

前言 场景大致是会上传一个几十页的扫描件PDF&#xff0c;让AI在当中找出我需要的字段&#xff0c;本文会隐去具体行业信息和具体的AI提示词内容&#xff0c;只分享技术相关内容&#xff0c;请见谅。 AI模型选择 针对我们行业的使用场景&#xff0c;我主要测试了GPT、Claude以…...

为什么https先非对称加密,然后对称加密?

HTTPS之所以先使用非对称加密&#xff0c;然后在对称加密&#xff0c;主要是基于两者在加密效率与安全性方面的特性考虑。 首先&#xff0c;非对称加密具有极高的安全性&#xff0c;因为它使用了公钥和私钥这一对密钥。公钥是公开的&#xff0c;任何人都可以使用它来加密数据&…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...