m个珠子共n种颜色,找出包含n种颜色的最短连续片段(百度面试题)

2024-08-22 16:32

本文主要是介绍m个珠子共n种颜色,找出包含n种颜色的最短连续片段(百度面试题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 这个题有很多变种,先考虑最简单的情况,m个珠子排成一行(不成环),求包含n种颜色的最短连续片段。可以将题目抽象成有一个数组a,大小为m。数组a里的每个元素的取值范围是[1,n](表示n种颜色),那么求数组a中包含[1,n]所有整数的最短的序列的长度。

    比如m=11,n=3的情况

数组a

 数组a的坐标 1 2 3 4 5 6 7 8 9 10 11
 数组a的颜色值 1 2 2 1 1 3 2 2 3 2 3
   
   
解法一:暴力法,这是最容易想到,并且简单的方法。

算法描述:从数组a的坐标1开始逐个向后检查,直到包含了所有的颜色值(3个),记录下连续片段的长度len,然后再从数组a的坐标2开始检查……

这个算法的时间复杂度是O(N2)。


解法二:新申请一个数组b,大小为3(颜色值的个数)并初始化为0。数组b[i]的值是颜色值为i的元素出现的次数。

算法描述:设置两个指针p1和p2,p1和p2开始时指向a数组中第一个元素,然后令b[a[1]]=1,然后p2开始向后走,检查下一个坐标的元素的值,比如下一个元素是a[2],a[2]=1,那么就设置b[a[2]]+=1,也就是b[1]+=1.直到b数组中所有的元素都不为0时,就说明p1到p2之间所有的元素已经包含了所有的三种颜色。此时记录下长度len=p2-p1. 然后指针p1将要往后移动,移动之前,要将p1指向的元素在颜色数组中去掉,也就是b[*p1]-=1,如果b的元素减1以后变为了0,就说明现在p1和p2之间少了一种颜色。所以p2要继续向后移动,来保证b数组中任意一个元素都大于0.    直到最后p2指针指向了数组的末尾,算法结束。

此算法只扫描一遍数组a即可,整体看时间复杂度为O(N)。

//令数组a和数组b的坐标都从1开始

int leastLength(int a[12]) { int length; int min = MAX_VALUE; int b[4]; memset(b, 0, sizeof(b)); int *p1 = a; int *p2 = a; while(p2 < &a[12]) { while(数组b中有0 && p2 <= &a[12]) { b[*p2]+=1; p2++; } while(数组b中没有0) { b[*p1]-=1; p1++; } if(p2 <= &a[12]) { length = p2-p1+2; if(length < min) { min = length; } } else return min; } return min; }

这篇关于m个珠子共n种颜色,找出包含n种颜色的最短连续片段(百度面试题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096799

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

找出php中可能有问题的代码行

前言 当你发现一个平时占用cpu比较少的进程突然间占用cpu接近100%时,你如何找到导致cpu飙升的原因?我的思路是,首先找到进程正在执行的代码行,从而确定可能有问题的代码段。然后,再仔细分析有问题的代码段,从而找出原因。 如果你的程序使用的是c、c++编写,那么你可以很容易的找到正在执行的代码行。但是,程序是php编写的,如何找到可能有问题的代码行呢?这个问题就是本文要解决的问题。 背景

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不

【附答案】C/C++ 最常见50道面试题

文章目录 面试题 1:深入探讨变量的声明与定义的区别面试题 2:编写比较“零值”的`if`语句面试题 3:深入理解`sizeof`与`strlen`的差异面试题 4:解析C与C++中`static`关键字的不同用途面试题 5:比较C语言的`malloc`与C++的`new`面试题 6:实现一个“标准”的`MIN`宏面试题 7:指针是否可以是`volatile`面试题 8:探讨`a`和`&a`