【刷题之路】LeetCode 程序员面试金典 08.03. 魔术索引

news2024/10/6 12:35:30

【刷题之路】LeetCode 程序员面试金典 08.03. 魔术索引

  • 一、题目描述
  • 二、解题
    • 1、方法1——暴力法
      • 1.1、思路分析
      • 1.2、代码实现
    • 2、方法2——二分+分治
      • 2.1、思路分析
      • 2.2、代码实现

一、题目描述

原题连接: 面试题 08.03. Magic Index LCCI
题目描述:
魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。

示例1:

输入: nums = [0, 2, 3, 4, 5]
输出: 0
说明: 0下标的元素为0

示例2:

输入: nums = [1, 1, 1]
输出: 1

说明:
nums长度在[1, 1000000]之间
此题为原书中的 Follow-up,即数组中可能包含重复元素的版本

二、解题

1、方法1——暴力法

1.1、思路分析

最简单的方法就是直接遍历数组的每个元素,找到第一个nums[i] = i的元素,直接返回其下标即可。

1.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

int findMagicIndex1(int* nums, int numsSize) {
    assert(nums);
    int i = 0;
    for (i = 0; i < numsSize; i++) {
        if (nums[i] == i) {
            return i;
        }
    }
    return -1;
}

时间复杂度:O(n),n为数组长度,最坏情况下我们需要遍历完数组中的所有元素。
空间复杂度:O(1),我们只需要用到常数级的额外空间。

2、方法2——二分+分治

2.1、思路分析

既然是在有序数组中进行查找,那我们很容易就能想到能使用二分查找,具体算法思路如下:
如果nums[mid] == mid,则说明如果想要找到更优解,就只能继续mid的左侧:
在这里插入图片描述
而当nums[mid] != mid时,并不能确定最优解是在左侧还是在右侧,因为左侧和右侧都有可能存在符合条件的解或者不存在解。所以我们这时候左侧右侧的区间都要寻找一遍:
在这里插入图片描述
所以在二分的基础上我们还需要使用分治算法的思想,来递归寻找左右两侧区间,只不过这里我们得有先寻找左侧区间,
如果在左区间找到了更优解,那就不需要再寻找右区间了。

2.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

// 先写一个二分分治算法
void binary_finder(int* nums, int left, int right, int* answer) {
    assert(nums && answer);
    if (left < right) { // 递归结束条件
        return;
    }
    int mid = left + (right - left) / 2;
    if (nums[mid] == mid) {
        *answer = mid;
        return binary_finder(nums, left, mid - 1, answer);
    }
    else {
        return binary_finder(nums, left, mid - 1, answer);
        if (-1 == *answer || *answer > right) {
            return binary_finder(nums, mid + 1, right, answer);
        }
    }
}
int findMagicIndex2(int* nums, int numsSize) {
    assert(nums);
    int answer = -1;
    binary_finder(nums, 0, numsSize - 1, &answer);
    return answer;
}
int main() {
    int nums[] = { 3,4,5,5,5,5 };
    int len = sizeof(nums) / sizeof(nums[0]);
    int result = findMagicIndex2(nums, len);
    printf("%d\n", result);
    return 0;
}

时间复杂度:O(n),n为数组的长度,最坏情况下,我们还是需要遍历完数组中的所有元素。
空间复杂度:O(n),空间复杂度主要取决于递归调用的次数,最坏的情况下我们每个元素都要判断一次,故需要调用n次,空间复杂度为O(n)。

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

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

相关文章

计算机网络考试复习——第三章 3.3

3.3 使用广播信道的数据链路层 3.3.1局域网的数据链路层 局域网最主要的特点&#xff1a; 1.网络为一个单位所拥有&#xff1b; 2.地理范围和站点数目均有限。 局域网具有如下主要优点&#xff1a; 1.具有广播功能&#xff0c;从一个站点可很方便地访问全网。 2.便于系统…

分布式问题,你知道几个?

你好&#xff0c;我是田哥 现在的单体服务是很难应付面试了&#xff0c;必须要把分布式相关技术给讲清楚&#xff0c;否则面试难搞。 下面我们来聊聊&#xff0c;分布式环境下会面临哪些问题。 先来看一下主要内容&#xff1a; 分布式系统中常见的难题包括&#xff1a; 一致性问…

PackageMS 启动

1.PackageMS 相关框架类 2.PackageMS 启动过程 2.1 # SystemServer.java /** 291 * The main entry point from zygote. 292 */ 293 public static void main(String[] args) { 294 new SystemServer().run(); 295 } 上面是SystemServer的主函数。 pr…

RK3568开发板 buildroot编译配置

启扬智能RK3568开发板提供两种文件系统&#xff0c;一种是Debian&#xff0c;另外一种是BuildRoot。在使用过程中&#xff0c;有些客户需要添加属于自己的软件包&#xff0c;所以在此分享启扬RK3568关于BuildRoot编译配置的方法以及相关注意事项。 启扬提供的源码是完整sdk&am…

毕业论文用什么流程图软件比较好?

在写作论文的时候使用流程图&#xff0c;会让我们的论文看起来更加有逻辑。并且流程图的图片都可以在PPT中随意插入以及使用。 基础流程图作为最为基本和简单的的流程图方式&#xff0c;一般不区分用户角色和场景&#xff0c;适用于简单场景&#xff0c;梳理单一的流程情况&am…

nssctf web入门(8)

目录 [SWPUCTF 2021 新生赛]easy_sql [SWPUCTF 2021 新生赛]error 这里通过nssctf的题单web安全入门来写&#xff0c;会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列&#xff0c;之后会一直出这个题单的解析&#xff0c;题目一共有28题&#xff0c;…

mysql(8.0)_主从复制

1.环境介绍 自己的主机--master 同学的主机--slave2.安装mysql https://blog.csdn.net/weixin_45955039/article/details/130144515?spm1001.2014.3001.55013. 准备工作 3.1在云服务器上添加端口号 3.2关闭防火墙 systemctl stop firewalld setenforce 04.master上的配置 …

数字图像处理笔记 第二章 数字图像基础

第二章 数字图像基础 2.1 视觉感知要素 知己知彼&#xff0c;百战不殆。了解人类的视觉感知&#xff0c;有助于我们学习数字图像处理。本小节中眼睛中图像的形成&#xff0c;让我联想到照相机成像&#xff0c;人眼的亮度适应和辨别让我想到手机屏幕的自动调节亮度。由于这部分…

马尔科夫链HMM

在机器学习算法中&#xff0c;马尔可夫链(Markov chain)是个很重要的概念。马尔可夫链&#xff08;Markov chain&#xff09;&#xff0c;又称离散时间马尔可夫链&#xff08;discrete-time Markov chain&#xff09;&#xff0c;因俄国数学家安德烈马尔可夫&#xff08;俄语&a…

如何排查线上环境CPU100%问题

如何排查线上环境CPU100%问题 cpu爆满的原因可能&#xff1a;1、形成了死锁。2、形成了死循环 1.使用arthas 2.使用命令的方式 死锁的检查&#xff1a; 方式一&#xff1a; 可通过jps或者ps -ef | grep java的命令查看到运行程序的PID使用jstack -l pid 命令查看线程的堆栈信…

代码随想录|day49|动态规划part10● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

它来了它来了&#xff01;我们最爱的股票问题它来了&#xff01;&#xff01; 121. 买卖股票的最佳时机 链接&#xff1a;代码随想录 视频链接&#xff1a;动态规划之 LeetCode&#xff1a;121.买卖股票的最佳时机1_哔哩哔哩_bilibili 好难懂&#xff0c;尤其是理解状态的变化以…

openGauss 5.0企业版主从部署,实战狂飙

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

【排序】归并排序(递归和非递归)

归并排序 前言图解大致思路代码实现递归非递归 时间复杂度和空间复杂度 前言 这是我讲的最后一个排序了&#xff0c;归并排序难度不大&#xff0c;也是分治的思想。 归并排序时间复杂度是在N*logN里面还是比较优的&#xff0c;毕竟实现起来的是完全二分的&#xff0c;但是差就…

2023第十届大唐杯省赛心得体会总结

第十届“大唐杯”全国大学生新一代信息通信技术大赛结束&#xff0c;分享一下2023第十届大唐杯省赛的相关经验。 年初研究生组就开始报名了&#xff0c;所以这回也是摩拳擦掌&#xff0c;加上大唐杯的认可度很高&#xff0c;今年的情况只会更卷&#xff0c;需要掌握一定的通信…

java数据结构学习第三期

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

4.17-4.18学习总结

MD5 MD5: 1、压缩性 2、容易计算 3、抗修改性 4、弱抗碰撞 5、强抗碰撞 为什么需要MD5&#xff1f; 存储一些敏感信息的时候&#xff0c;如果不进行加密会出现安全问题。 例如&#xff1a;系统登录的密码&#xff0c;如果数据库中的密码采用明文&#xff0c;一旦数据库泄…

扬帆优配|多路资金扎堆博弈,顶级游资章盟主3天爆买21个亿

4月20日&#xff0c;中科曙光&#xff08;603019.SH&#xff09;盘中稳步拉升&#xff0c;最终收涨9.99%&#xff0c;股价一举刷出了历史新高&#xff0c;达到了54.71元/股&#xff0c;全天的成交额也高达97.43亿元。 盘后发表的龙虎榜数据显现&#xff0c;知名游资章盟主的常用…

Qt Quick - PageIndicator

Q 理论使用总结 一、概述二、简单使用例子1. SwipeView 和 PageIndicator2. StackLayout 和 PageIndicator 三、常用属性四、定制化 一、概述 PageIndicator用于指示含有多个页面的容器中&#xff0c;当前处理活动的页。记住&#xff0c;这个只是指示当前的活动页&#xff0c;…

java IO流进阶 对象处理流, 转换流, 打印流

目录 一、对象处理流 1.作用 : 2.序列化和反序列化 : 3.ObjectOutputStream : 1 概述 2 演示 4.ObjectInputStream : 1 概述 2 演示 5.关于序列化的细节 : 6.标准输入输出流&#xff1a; 二、转换流 1.概述 : 2.InputStreamReader : 3.OutputStreamWriter : 三、打印…

GB/T28181国标视频监控平台TINYGBS实现监控视频直播的详细搭建流程

TinyGBS是基于GB/T28181-2016(公共安全视频监控联网系统信息传输、交换、控制技术要求)开发的成熟的、敏捷的、产品化的视频汇聚平台&#xff0c;支持标准的监控设备的接入和管理&#xff0c;在多个应用场景中成功落地。实现实时视频调阅、设备控制(云台控制、聚焦控制、拉框放…