字节3面真题,LeetCode上hard难度,极具启发性题解

news2024/11/14 20:42:08

请添加图片描述

文章目录

  • 🚀前言
  • 🚀LeetCode:41. 缺失的第一个正整数
  • 🚀思路
  • 🚀整个代码思路串一下
  • 🚀Code

🚀前言

铁子们好啊!阿辉来讲道题,这道题据说是23年字节3面真题,LeetCode上面hard难度,而且是很多难题的基础模板,今天阿辉就带你拿下它!!!

🚀LeetCode:41. 缺失的第一个正整数

链接🔗:缺失的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:
输入:nums = [1,2,0]
输出:3

示例 2:
输入:nums = [3,4,-1,1]
输出:2

示例 3:
输入:nums = [7,8,9,11,12]
输出:1

🚀思路

首先这道题要求时间复杂度在O(n),空间复杂度在O(1)
很明显可以想到二分或者有限次的遍历数组

  1. 对于本题,这道题让我们找到数组中缺失的第一个正整数,我们很容易想到排序然后便利数组,看看数组里面最先缺了谁,这道题就解决了,但是很遗憾时间复杂度限制在了O(n)空间复杂度O(1)不能用排序
  2. 不过上述的思考并非毫无意义,对于本题并非不能排序,因为我们要找的是缺失的第一个正整数,只要我们能够做到将数组中从1~x的数字排好即可,x+1即为所求,而排好这部分数我们仅需遍历一遍数组即可
  3. 铁子们是不是要问为何如此,因为1~x这些数字本身就决定了他们的位置,1本身就是他自己的索引,比如:1填在数组中0位置,2填在1位置,数字n填在n-1位置
  4. 对于一个长度为n的数组num,不一定整个数组都是1~n的数字,对于负数就属于垃圾,大于n的数也是垃圾,重复的数也是垃圾,为什么这么说,因为我们的目的是排1~x不间断连续的数字,其他的都没用,1~x排好了,这题也就拿下了
  5. 到这里兄弟们还觉得有难度吗?这不就是快拍的partition划分过程吗?拿下!!!!

🚀整个代码思路串一下

请添加图片描述

首先,我们准备两个数组偏移量left = 0right = n(n代表数组的长度),left的位置表示待排序的位置,right首先是垃圾区的边界,其次right还表示能够排完整个连续不间断正整数数列的长度,所以一开始,rightn

  • left当前位置的数字为left+1时,++left
  • left当前位置的数字处于left+1right之间且它本该在的位置也空出来的时候时,left位置的数与这个数本该在的位置交换,也就是num[left]num[num[left]-1]的数交换
  • 当上面两种情况都不成立时,left当前位置的数就是垃圾数,与r-1位置的数交换,并且--r垃圾区扩充

🚀Code

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int left = 0;//左边界
        int right = nums.size();//右边界
        while (left < right) {//当left来到right时跳出循环
            if (nums[left] == left + 1) {//当left当前位置的数字为left+1时,++left
                ++left;
            }
            //垃圾区
            else if (nums[left] <= left || nums[left] > right || nums[left] == nums[nums[left] - 1]) {
                swap(nums[left], nums[--right]);
            }
            //当`left`当前位置的数字处于`left+1`到`right`之间
            //且它本该在的位置也空出来的时候时
            else {
                swap(nums[left], nums[nums[left] - 1]);
            }
        }
        return left + 1;//要加1,因为1在0位置,n就在n-1位置
    }
};

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( 1 ) O(1) O(1)

请添加图片描述

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

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

相关文章

类加载器的三种+双亲委派机制大概了解

类加载器有哪几种分别是加载哪些类的 类加载一共可以分为三种&#xff1a; 分别为&#xff1a; 启动类加载器&#xff08;Bootstrap Class Loader&#xff09;&#xff1a;负责加载Java的核心类库&#xff0c;如java.lang包中的类。扩展类加载器&#xff08;Extension Class …

jsp教务管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教务管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

功能强大的国外商业PHP在线教育系统LMS源码,直播课程系统

源码介绍 Proacademy是在线教育一体化的解决方案&#xff0c;用于创建类似于Udemy、Skillshare、Coursera这种在线教育市场。 这个平台提供在线课程&#xff0c;现场课程&#xff0c;测验等等&#xff0c;并有一个基于实际业务需要的高级认证插件&#xff0c;程序基于Laravel…

Three.js学习8:基础贴图

一、贴图 贴图&#xff08;Texture Mapping&#xff09;&#xff0c;也翻译为纹理映射&#xff0c;“贴图”这个翻译更直观。 贴图&#xff0c;就是把图片贴在 3D 物体材质的表面&#xff0c;让它具有一定的纹理&#xff0c;来为 3D 物体添加细节的一种方法。这使我们能够添加…

使用会话API实现会话管理

使用会话API实现会话管理 问题陈述 Larry Wiliams是Countryside Markets服装部的负责人。Larry让公司网站的开发人员John开发一个应用程序,以便跟踪用户选择地衬衫并相应地更新金额。 解决方案 要解决上述问题,John需要执行以下任务: 创建Web应用程序。创建登录页面。创建验…

【机器学习】数据清洗之识别缺失点

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步…

飞天使-linux操作的一些技巧与知识点8-zabbix6.0 容器搭建

文章目录 安装docker安装步骤mysql下载镜像安装zabbix 测试效果 安装docker 1. 配置官方 yum 源$ sudo yum install -y yum-utils $ sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo2. 安装 Docker$ sudo yum install docker-c…

并发编程 java锁机制

1、什么是锁&#xff0c;为什么需要锁&#xff1f; 并发环境下&#xff0c;会存在多个线程对同一个资源进行争抢的情况&#xff0c;假设线程A对资源正在进行修改&#xff0c;此时线程B又对同一资源进行了修改&#xff0c;就会导致数据不一致的问题。为了解决这个问题&#xff…

不到1s生成mesh! 高效文生3D框架AToM

论文题目&#xff1a; AToM: Amortized Text-to-Mesh using 2D Diffusion 论文链接&#xff1a; https://arxiv.org/abs/2402.00867 项目主页&#xff1a; AToM: Amortized Text-to-Mesh using 2D Diffusion 随着AIGC的爆火&#xff0c;生成式人工智能在3D领域也实现了非常显著…

【人工智能】横扫市场的巨星大模型:探秘当今最热门的AI力量(14)

今年&#xff0c;ChatGPT成了大家的明星&#xff0c;简直是个神奇的助手&#xff01;问什么问题&#xff0c;都秒回&#xff0c;写各种文字、甚至代码&#xff0c;简直是工作利器。而国内这半年AI领域热度不减&#xff0c;涌现了一批新公司和产品&#xff0c;大厂也在风头上。A…

【学习笔记】TypeScript编译选项

TS 中的编译选项 我们写了一个TS的文件&#xff0c;我们需要使用如下的命令将我们的TS文件转换为JS文件。 tsc xxx.ts 这样会产生一个对应的js文件 自动编译文件 编译文件时&#xff0c;使用 -W 指令后&#xff0c;TS编译器会自动监视文件的变化&#xff0c;并在文件发生变…

MySQL篇之定位与优化MySQL慢查询

一、如何定位慢查询 1.方案一&#xff1a;开源工具 调试工具&#xff1a;Arthas。 运维工具&#xff1a;Prometheus 、Skywalking。 2.方案二&#xff1a;MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;…

Habitat环境学习四:Habitat-sim基础用于导航——使用导航网格NavMesh

如何使用导航网格NavMesh 官方教程1、NavMesh基础定义1.1 使用NavMesh的原因1.2 什么是NavMesh 2、NavMesh的使用方法2.1 获取自上而下Top down view视角地图2.2 在NavMesh中进行查询以及随机产生可导航点2.3 查找最短路径2.4 场景加载NavMesh2.5 重新计算并生成NavMesh2.6 什么…

python-分享篇-画樱花

文章目录 画樱花代码效果 画樱花 代码 from turtle import * from random import * from math import *def tree(n,l):pd()#下笔#阴影效果t cos(radians(heading()45))/80.25pencolor(t,t,t)pensize(n/3)forward(l)#画树枝if n>0:b random()*1510 #右分支偏转角度c ran…

openGauss学习笔记-216 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-CPU

文章目录 openGauss学习笔记-216 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-CPU216.1 CPU216.2 查看CPU状况216.3 性能参数分析 openGauss学习笔记-216 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-CPU 获取openGauss节点的CPU、内存、I/O和网络资源使用情况…

神经网络 | 常见的激活函数

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要介绍神经网络中必要的激活函数的定义、分类、作用以及常见的激活函数的功能。 目录 一、激活函数定义 二、激活函数分类 三、常见的几种激活函数 1. Sigmoid 函数 &#xff08;1&#xff09;公式 &#xff08;2&a…

Open CASCADE学习|点和曲线的相互转化

目录 1、把曲线离散成点 1.1按数量离散 1.2按长度离散 1.3按弦高离散 2、由点合成曲线 2.1B样条插值 2.2B样条近似 1、把曲线离散成点 计算机图形学中绘制曲线&#xff0c;无论是绘制参数曲线还是非参数曲线&#xff0c;都需要先将参数曲线进行离散化&#xff0c;通过离…

JavaScript综合练习1

JavaScript 综合练习 1 1. 循环嵌套 两个以上的循环进行套娃。 1.1. 语法 for (外部声明记录循环次数的变量; 循环条件; 变化值) {for (内部声明记录循环次数的变量; 循环条件; 变化值) {循环体;} }2. 倒三角 2.1. 案例 2.2. 代码实现 // 外层打印几行 for (let i 1; i …

【高阶数据结构】位图布隆过滤器

文章目录 1. 位图1.1什么是位图1.2为什么会有位图1.3 实现位图1.4 位图的应用 2. 布隆过滤器2.1 什么是布隆过滤器2.2 为什么会有布隆过滤器2.3 布隆过滤器的插入2.4 布隆过滤器的查找2.5 布隆过滤器的模拟实现2.6 布隆过滤器的优点2.7 布隆过滤器缺陷 3. 海量数据面试题3.1 哈…

在windows的控制台实现贪吃蛇小游戏

欢迎来到博主的文章 博主id&#xff1a;代码小豪 前言&#xff1a;看懂这篇文章需要具有C语言基础&#xff0c;还要对单链表具有一定的理解。如果你只是想要试玩这个游戏&#xff0c;可以直接在文章末尾找到源码 由于实现贪吃蛇需要调用Win32 API函数&#xff0c;这些函数我会…