《程序员面试金典(第6版)》面试题 10.05. 稀疏数组搜索(二分法,分治算法入门题目,C++)

news2024/9/25 7:19:41

题目描述

稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。

示例1:

  • 输入: words = [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,“dad”, “”, “”], s = “ta”
  • 输出:-1
  • 说明: 不存在返回-1。

示例2:

  • 输入:words = [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,“dad”, “”, “”], s = “ball”
  • 输出:4

提示:

  • words的长度在[1, 1000000]之间

解题思路与代码

  • 这道题是一道十足的简单题,我们可以用两种方式去解决它。一种方法是顺序查找元素,那么它的时间复杂度为O(n),另一种就是使用二分法,它的时间复杂度为O(log(n)),n为字符数组中元素的个数。下面就让我们来看看这两种方法各自的实现是什么?

方法一: 顺序查找

很简单,就是一个for循环去比较元素,如果相等,返回下标,如果找不到目标元素,返回 -1。

具体的代码如下:

class Solution {
public:
    int findString(vector<string>& words, string s) {
        for(int i = 0; i < words.size(); ++i){
            if(words[i] == s) return i;
        }
        return -1;
    }
};

在这里插入图片描述

复杂度分析

时间复杂度 O(n)
空间复杂度 O(1)

方法二:二分查找

  • 我们首先设置两个指针left 与 right,分别指向数组的首元素与尾元素。然后使用while循环去遍历。
  • 我们找出数组的中间元素mid,用一个temp遍历去记录此时mid的值。如果mid为空,就while循环遍历mid。++mid。mid < right 是内层for循环的停止条件。这个目的是使中间元素的字符串不为空。
  • 假如最后mid 还是为空,我们就缩小right的范围,使right = temp -1;然后跳过此次循环。
  • 之后,我们开始进行二分查找与比较操作。这里我们要用到string自带的成员比较函数compare
    • 如果word[mid] = s,就直接返回mid。
    • 如果word[mid] < s,left = mid + 1;
    • 否则right = mid -1;

具体的实现请看代码

class Solution {
public:
    int findString(vector<string>& words, string s) {
        int left = 0;
        int right = words.size() - 1;
        while(left <= right){
            int mid = (left + right) / 2;
            int temp = mid;
            while(words[mid] == "" && mid < right)
                ++mid;
            if(words[mid] == ""){
                right = temp -1;
                continue;
            }
            int cmp = words[mid].compare(s);
            if(cmp == 0) return mid;
            else if(cmp < 0) left = mid + 1;
            else right = mid - 1;
        }
        return -1;
    }
};

在这里插入图片描述

复杂度分析

首先,我们来分析这段代码的时间复杂度。

  • 在最好的情况下,如果目标字符串是中间的元素,时间复杂度为 O(1)。但这不是我们关心的情况,我们需要分析最坏情况和平均情况。

  • 在最坏情况下,空字符串的数量可能非常多,导致代码的时间复杂度降低。每次执行循环时,我们可能需要跳过 k 个空字符串,其中 k 是当前区间内的空字符串数量。在最坏情况下,k 可能接近 n/2,这将使时间复杂度变为 O(k * log(n)),即 O(n * log(n))。

  • 然而,在平均情况下,空字符串应该较少,时间复杂度应接近 O(log(n))。这是因为二分查找法在平均情况下具有 O(log(n)) 的时间复杂度,而跳过空字符串只会稍微影响性能。

接下来,我们分析空间复杂度。

  • 这段代码中,我们只使用了一些辅助变量(如 left、right、mid、temp 和 cmp),而没有使用任何额外的数据结构。因此,空间复杂度为 O(1)。这意味着代码具有很好的空间效率。

总结一下,这段代码在平均情况下的时间复杂度为 O(log(n)),空间复杂度为 O(1)。在最坏情况下,时间复杂度可能会降低,但这取决于空字符串的分布情况。

总结

  • 这道题其实可以算是学习二分法或者分治思想的入门题目,还是很有必要去学习和掌握一下的。
  • 觉得我写的还行的小伙伴们请给我点一个赞,你们的赞就是对我持续输出优质内容的最大鼓励,谢谢!

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

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

相关文章

2023有哪些便宜好用的蓝牙耳机?性价比最高的无线耳机排行

不管入手什么东西&#xff0c;性价比永远能成为人们入手的最重要的参考要素之一。那么&#xff0c;在蓝牙耳机市场中&#xff0c;有哪些便宜好用的蓝牙耳机&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款性价比最高的无线耳机&#xff0c;一起来看看吧。 一、南卡小音…

采购系统是如何管理供应商的?

随着数字化的推进&#xff0c;企业面临着越来越多的供应商管理问题。企业采购数字化转型已经成为大势所趋&#xff0c;对于采购数字化转型而言&#xff0c;供应商管理是重要一环。 供应商准入管理 在供应商准入阶段&#xff0c;企业需要从供应商资质、财务能力、信誉能力、管理…

vite 安装腾讯im组件TUIKit问题记录

按照vue3ts要求安装依赖包 即时通信 IM Web & H5-含 UI 集成方案&#xff08;荐&#xff09;-文档中心-腾讯云 (tencent.com) 这个版本的文档采用全局安装sass&#xff1a; npm install -g sass sass-loader10.1.1 实际安装后遇到无法解析sass的错误提示&#xff0c;使用…

JumpServer堡垒机部署+基本使用

文章目录JumpServer 堡垒机一、理论知识&#xff1a;1、堡垒机与跳板机的区别2、JumpServer4A认证二、实践实验:1、初始化环境准备2、MySQL数据库部署3、Python3.6 程序部署4、Redis数据库部署5、Core组件部署6、Koko组件部署7、Guacamole组件部署1、安装FFmpeg2、安装Guacamol…

socket 及 字节序转换(嵌入式学习)

socket 及 字节序转换socket简介Socket为什么需要Socket&#xff1f;socket类型Socket通信模型字节序主机字节序到网络字节序网络字节序到主机字节序IP地址转换socket简介 1、1982 - Berkeley Software Distributions 操作系统引入了socket作为本地进程之间通信的接口 2、1986…

SAP MDG —— 使用DIF导入物料主数据 Part2 配置和应用

文章目录关于使用DIF处理物料主数据的相关信息配置定义数据传输对象类型 Object Types文件源和存档目录Web Dynpro 应用导入选项MDG_BS_FILE_IMPORT 的选择项本章小结关于使用DIF处理物料主数据的相关信息 配置 定义数据传输对象类型 Object Types 路径&#xff1a; MDGIMG-…

读懂AUTOSAR :DiagnosticLogAndTrace DLT(四)-- API解析

一、周期调用的函数&#xff1a;Dlt_TxFunction 根据参数DltGeneralTrafficShapingSupport&#xff0c;决定如何去发送DLT消息。如果为TRUE&#xff0c;那需要参考参数DltLogChannelTrafficShapingBandwidth为每个Log通道设置发送带宽&#xff1b;如果为FALSE&#xff0c;那么…

《LKD3粗读笔记》(9)内核同步介绍

文章目录1、临界区和竞争条件2、 加锁3、死锁4、争用和扩展性实现内核同步的意义是什么&#xff1f; 目前内核支持SMP&#xff0c;所以共享资源一定要防止并发访问&#xff0c;如果多个执行线程同时访问和操作数据&#xff0c;就可能发生各线程之间相互覆盖共享数据情况&#x…

ABeam News | 松下家电(中国)生产销售一体化SAP S/4HANA项目正式启动

近日&#xff0c;由德硕管理咨询&#xff08;上海&#xff09;有限公司参与实施的松下家电&#xff08;中国&#xff09;生产销售一体化SAP S/4HANA项目正式上线&#xff0c;松下集团代表董事全球副总裁本间哲朗先生及ABeam大中华区董事长兼总经理中野洋辅先生出席了项目启动会…

【实验报告】实验二 图像空间域频率域滤波

一&#xff0e;实验目的&#xff1a; 1. 模板运算是空间域图象增强的方法&#xff0c;也叫模板卷积。 &#xff08;1&#xff09;平滑&#xff1a;平滑的目的是模糊和消除噪声。平滑是用低通滤波器来完成&#xff0c;在空域中全是正值。 &#xff08;2&#xff09;锐化&…

【超全总结】集成环信消息推送注意事项(华为、oppo、vivo等)

环信即时通讯 IM 支持集成第三方厂商的消息推送服务&#xff0c;为 Android 开发者提供低延时、高送达、高并发、不侵犯用户个人数据的离线消息推送服务。 当客户端应用进程被关闭等原因导致用户离线&#xff0c;环信即时通讯 IM 服务会通过第三方厂商的消息推送服务向该离线用…

鸿蒙Service Ability的前世今生--进阶篇

二、SA的配置 ​ SA的运行需要配合多个配置项&#xff0c;此节专门对此进行说明。 ​ OpenHarmony中SA一般由两个配置文件和一个so组成。上一章节已介绍了生成so中代码。此节描述下另外两个配置文件(.cfg或.rc、xml)。 ​ SA的启动一般采用.cfg或.rc .xml libxxx.z.so方式…

Python 编程必不可少的unittest测试框架

一段表面看起来平平无常的代码&#xff0c;很可能暗藏很多bug无法一眼看透&#xff0c;没有经过测试的代码是不可靠的代码。上一篇讲过pytest测试框架这次我们换个框架。 unittest 是一个单元测试框架&#xff0c;单元测试完成对一个模块、一个类或一个函数的运行结果进行检验…

SpringSecurity之注销与自动登录

前言 前面我们讲解了用户的登录以及用户授权的过程。今天我们看一下&#xff0c;系统中常用的注销与自动登录各功能&#xff01; 注销操作 注销操作&#xff0c;首先需要在我们的配置类中添加上我们的注销路径。主要配置详见下方标红处代码&#xff0c;标记了退出的路径以及…

java轻量级框架MiniDao的详解

MiniDao是一款基于Java语言开发的轻量级持久层框架&#xff0c;它的目标是简化数据库操作流程&#xff0c;提高开发效率&#xff0c;减少代码量。MiniDao采用简单的注解配置方式&#xff0c;可以很容易地与Spring等常用框架集成使用。 MiniDao的主要特点包括&#xff1a; 简单…

浙大数据结构网课第一周入门

题目详情 Given a sequence of K integers { N1​, N2​, ..., NK​ }. A continuous subsequence is defined to be { Ni​, Ni1​, ..., Nj​ } where 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For …

RBF-UKF径向基神经网络结合无迹卡尔曼滤波估计锂离子电池SOC(附MATLAB代码)RBF神经网络训练部分

1.清空变量 close all clear,clc 2.导入数据用以RBF神经网络训练&#xff0c;一共14组&#xff0c;训练数据P&#xff08;第一列为电压值&#xff0c;第二列为SOC值&#xff0c;第三列为电流值。&#xff09;&#xff0c;并将所有数据存储在变量PP中&#xff0c;所有电压数据…

蓝桥杯:优秀的拆分

蓝桥杯&#xff1a;优秀的拆分https://www.lanqiao.cn/problems/801/learning/ 目录 题目描述 输入描述 输出描述 输入输出样例 输入 输出 输入 输出 题目分析&#xff08;位运算&#xff09; AC代码&#xff08;Java) 题目描述 一般来说&#xff0c;一个正整数可以拆…

【】:addService 和 getService

一次完整的 Binder IPC 通信过程通常是这样&#xff1a; 首先 Binder 驱动在内核空间创建一个数据接收缓存区&#xff1b; 接着在内核空间开辟一块内核缓存区&#xff0c;建立内核缓存区和内核中数据接收缓存区之间的映射关系&#xff0c;以及内核中数据接收缓存区和接收进程用…

无线传感器网络硬件设计简介

无线传感器网络硬件设计简介 无线传感器网络因其巨大的应用前景越来越受到学术界和工业界的广泛关注。本文介绍了无线传感器网络节点的体系结构&#xff0c;分析比较了国内外当前典型的硬件平台&#xff0c;重点讨论了目前无线传感器网络节点常用的处理器、射频芯片、电源和传…