[Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]

【问题描述】[简单]

在这里插入图片描述

【解答思路】

1. 逐个查找

时间复杂度:O(N) 空间复杂度:O(1)

public int findMagicIndex(int[] nums) {for (int i = 0, length = nums.length; i < length; i++) {if (i == nums[i])return i;}return -1;}
2. 逐个查找优化

有序升序整数
假如nums[0]=100,假如是升序的,那么num[0]后面的值都不会比100小,所以i如果还是一步步的加,效率肯不高,我们直接让i从100开始,因为小于100的i肯定是查找不到的。

时间复杂度:O(N) 空间复杂度:O(1)

    public int findMagicIndex(int[] nums) {for (int i = 0, length = nums.length; i < length; i++) {if (i == nums[i])return i;if (nums[i] > i + 1) {//如果nums[i]大于i+1,我们就让i加上nums[i] - 1,// 这里减1的目的是为了抵消上面for循环中的i++。//这里判断的时候为什么是nums[i] > i + 1而不是//nums[i] > i ,因为如果num[i]只比i大1的话,//直接执行上面的i++就可以了,没必要再执行下面的计算i = nums[i] - 1;}}return -1;}
3. 递归

一想到排序数组很容易想到的是二分法查找,但是这里如果直接使用二分法查找的i不一定是最小的,有重复的数字。
[0,0,2,2,5] 存在多个满足
所以有一种方式就是先把数组劈两半,先在前面一半查,如果找到就直接返回,如果没找到就在后面部分查,并且前面部分和后面部分再分别劈两半,一直这样递归下去……。
在这里插入图片描述

时间复杂度:O(N) 空间复杂度:O(1)
在这里插入图片描述

class Solution {public int findMagicIndex(int[] nums) {return getAnswer(nums, 0, nums.length - 1);}public int getAnswer(int[] nums, int left, int right) {if (left > right) {return -1;}int mid = (right - left) / 2 + left;int leftAnswer = getAnswer(nums, left, mid - 1);if (leftAnswer != -1) {return leftAnswer;} else if (nums[mid] == mid) {return mid;}return getAnswer(nums, mid + 1, right);}
}

【总结】

暴力容易想到 也容易想到二分 但没想到它是不能直接用二分,而只能用二分剪枝的思想 直接使用二分一定要单调递增或递减

转载链接:https://leetcode-cn.com/problems/magic-index-lcci/solution/zhu-ge-cha-zhao-yi-ji-you-hua-di-gui-you-hua-ji-di/
参考链接:https://leetcode-cn.com/problems/magic-index-lcci/solution/mo-zhu-suo-yin-by-leetcode-solution/

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

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

相关文章

5如何让进行项目管理

项目管理分为五个过程组

python练习题-day25

class Person:  __key123def __init__(self,username,password):self.usernameusernameself.__passwordpassworddef __get_pwd(self):return self.__passworddef login(self):self.__get_pwd() alexPerson("alex","alex3714") print(alex._Person__passw…

第一章 概率论的基本概念

概率论与数理统计的学习内容来源于中国大学MOOC&#xff0c;以及参考书籍《概率论与数理统计》第四版&#xff0c;浙江大学。 随机现象  在一定条件下&#xff0c;有可能出现多种结果&#xff1b;而且在事情发生前不能知道结果。 随机试验  概念&#xff1a;对随机现象的…

【知识导图】数据结构与算法

[基础知识点] 10 个数据结构&#xff1a;数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树&#xff1b; 10 个算法&#xff1a;递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 [学习技巧] 学习它的“来历”“…

CF 1174 D. Ehab and the Expected XOR Problem 异或技巧

题意就是给我们两个数n,x。让我们构造个数组&#xff0c;数组有三个条件 1.要有尽可能多的元素 2.要其中任何一段数字的异或和不等于0和x 3.元素的范围是[ 1, 2n2^n2n&#xff09; 分析&#xff1a;如果对异或足够敏感的话 应该能想到其中第二个条件的意思&#xff0c;其实…

第三十七期:刷脸支付叫好不叫座,为啥消费者和商家都不愿用先进科技?

移动支付相信大多数人都不陌生&#xff0c;中国移动支付的普及被人称为“新四大发明”&#xff0c;在中国移动支付产品发展如火如荼的今天&#xff0c;刷脸支付成为了新的时尚&#xff0c;然而这个时尚的支付方式却显得叫好不叫座&#xff0c;刷脸支付的问题到底出在哪了? 移动…

Hadoop 配置文件 启动方式

配置文件&#xff1a; 默认的配置文件&#xff1a;相对应的jar 中 core-default.xml hdfs-default.xml yarn-default.xml mapred-default.xml 自定义配置文件$HADOOP_HOME/etc/hadoop/ core.site.xml hdfs-site.xml yarn-site.xml mapredu-site.xml 启动方式&#xff1a; 各个服…

第二章 随机变量

随机变量  目标&#xff1a;将实验结果数量化。实验结构有数字型和非数字型。数字型&#xff1a;降雨量、上车人数等。非数字型&#xff1a;晴天/阴天/下雨、化验结果阴性/阳性等。  定义&#xff1a;随机试验样本空间S&#xff0c;如果XX(e)为定义在S上的实数单值函数&…

[Leetcode][第632题][JAVA][最小区间][堆][滑动窗口]

【问题描述】[困难] 【解答思路】 1. 堆 复杂度 class Solution {public int[] smallestRange(List<List<Integer>> nums) {//区间的左边和右边int rangeLeft 0, rangeRight Integer.MAX_VALUE;//最小范围int minRange rangeRight - rangeLeft;//区间的左边最…

第十期:过去50年间,十大热门语言及发明者大盘点

本文收集了十大热门编程语言背后的程序员和设计者的名字和大家分享。以下是十大热门编程语言及其创建者&#xff0c;排名不分先后。 软件领域有许多编程语言&#xff0c;每年还涌现出越来越的新语言。新发布的语言有Scala、Kotlin、Go和Closure&#xff0c;但历史证明&#xff…

2018-2019-2 20165212《网络攻防技术》Exp5 MSF基础应用

2018-2019-2 20165212《网络攻防技术》Exp5 MSF基础应用 攻击成果 主动攻击的实践 ms17010eternalblue payload windows/x64/meterpreter/reverse_tcp&#xff08;成功&#xff09;payload generic/shellreversetcp&#xff08;成功&#xff09;ms17010psexec&#xff08;成功且…

【数据结构与算法】复杂度分析

一、什么是复杂度分析&#xff1f; 1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。 2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。 3.分别用时间复杂度和空间复杂度两个概念来描述性能问题&#xff0c;二者统称为复杂度。 4.复杂…

第十一期:30秒内便能学会的30个实用Python代码片段

许多人在数据科学、机器学习、web开发、脚本编写和自动化等领域中都会使用Python&#xff0c;它是一种十分流行的语言。 Python流行的部分原因在于简单易学。 本文将简要介绍30个简短的、且能在30秒内掌握的代码片段。 1. 唯一性 以下方法可以检查给定列表是否有重复的地方&…

使用scikit中的聚类

这是一次数据实验。基于七月算法邹博讲义和scikit-lean官网。 聚类&#xff1a;就是对大量未知标注的数据集&#xff0c;按数据的内在相似性将数据划分为多个类别&#xff0c;使得类别内的数据相似性较大而类别间的相似性较小。 1 k-means算法  参数&#xff1a;聚类的数目…

概率中比较重要的知识

-什么是协方差&#xff1f; 就是衡量两个随机变量&#xff08;X,YX,YX,Y&#xff09;之间相关性的量&#xff0c;取多个两个量的样本&#xff0c;通过判断他们大小变化关系&#xff0c;判断这两个量是正相关还是负相关或无相关。 记做&#xff1a;Cov(X,Y)E[(X−E(X))(Y−E(Y)…

MySQL学习(三)

-- 计算字段 -- 拼接字段 SELECT CONCAT(vend_name, (,vend_country,)) FROM Vendors ORDER BY vend_name;SELECT CONCAT(vend_name,vend_country) FROM Vendors ORDER BY vend_name;-- CONCAT(str1,str2,...) 拼接查询的值 SELECT CONCAT(vend_name,vend_country) FROM Vendo…

[Leetcode][第114题][JAVA][二叉树展开为链表][递归][迭代]

【问题描述】[中等] 【解答思路】 1. 前序遍历 将二叉树展开为单链表之后&#xff0c;单链表中的节点顺序即为二叉树的前序遍历访问各节点的顺序。因此&#xff0c;可以对二叉树进行前序遍历&#xff0c;获得各节点被访问到的顺序。 由于将二叉树展开为链表之后会破坏二叉树的…

第三十八期:美国数据隐私保护法案来临,明年1月生效,现仅2%企业合规

2018 年美国加州通过消费者隐私法案&#xff08;CCPA&#xff09;&#xff0c;缓冲一年多后&#xff0c;将于 2020 年 1 月生效。届时&#xff0c;类似于欧盟的法案&#xff0c;CCPA 将对所有和美国加州居民有业务的数据商业行为进行监管。 依然在应付欧盟数据保护法案(GDPR)的…

二元随机变量

本章记录  1二元随机变量的定义  2二元离散型随机变量的定义、联合概率分布律、边际分布律、条件分布律  3二元离散型随机变量联合概率分布律函数、边际分布函数、条件分布函数  4二元连续型随机变量的定义、联合概率密度函数、边际密度函数、条件密度函数 二元随机变…

深度学习:什么是backbone,benchmark,baseline

backbone&#xff1a;骨干网络&#xff0c;比如alexnet&#xff0c;ZFnet&#xff0c;VGG&#xff0c;googlenet... benchmark&#xff1a;性能指标&#xff0c;比如accuracy&#xff0c;内存消耗&#xff0c;模型复杂度&#xff0c;或者在性能上很有代表性的算法框架。 base…