不动点

简介: 🎈每天进行一道算法题目练习,今天的题目是“不动点”。

说在前面

🎈每天进行一道算法题目练习,今天的题目是“不动点”。

问题描述

给定已经按 升序 排列、由不同整数组成的数组 arr,返回满足 arr[i] == i 的最小索引 i。如果不存在这样的 i,返回 -1。

示例 1:

输入:arr = [-10,-5,0,3,7]
输出:3
解释:对于给定的数组,arr[0] = -10,arr[1] = -5,arr[2] = 0,arr[3] = 3,因此输出为 3 。

示例 2:

输入:arr = [0,2,5,8,17]
输出:0
解释:arr[0] = 0,因此输出为 0 。

示例 3:

输入:arr = [-10,-5,3,4,7,9]
输出:-1
解释:不存在这样的 i 满足 arr[i] = i,因此输出为 -1 。

提示:

1 <= arr.length < 10^4
-10^9 <= arr[i] <= 10^9

思路分析

阅读完题目后,我们可以知道,题目要求是要我们找到不动点,那么什么是不动点呢?题目是这样说的,满足arr[i] == i的最小索引i即是我们要找的不动点。
理解了题目之后,你是不是会觉得这题目就很简单的了,我们可以有以下两种做法。

1、暴力遍历O(n)

我们可以从前往后遍历,遇到第一个arr[i] == i时,此时的i就是题目要求的结果,我们直接return就可以了。

/**
 * @param {number[]} arr
 * @return {number}
 */
var fixedPoint = function(arr) {
    for(let i = 0; i < arr.length; i++) if(arr[i] === i) return i;
    return -1;
};

暴力遍历确实可以找出要求的结果,但是对于此题来说,我们还有更优的解法。

2、二分法O(log(n))

因为题目中说了给出的数组arr是按升序排序的,所以我们可以使用二分法来折半缩小搜索区间。我们只需要维护区间的左右两个端点,当区间中点的数字大于等于中点的下标时,我们需要缩小原来的区间,修改右端点为当前的中点,当区间中点的数字小于中点的下标时,我们也需要缩小原来的区间,修改左端点为当前的中点。

/**
 * @param {number[]} arr
 * @return {number}
 */
var fixedPoint = function(arr) {
    let l=0,r=arr.length-1;
    while(l<r){
        let mid = Math.floor((l+r)/2)
        if(arr[mid]>=mid)
            r=mid
        else
            l=mid+1
    }
    if(arr[l]==l) return l
    else return -1
};

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
前端开发 JavaScript
react createElement 和 cloneElement 有什么区别?
react createElement 和 cloneElement 有什么区别?
108 0
|
SQL Oracle 关系型数据库
【SQL系列】标量子查询
嵌套在 SELECT 子句中的 SELECT 子句被称为标量子查询,它们只能返回一个值。
386 0
|
开发工具 git C++
【Git】stash 仅贮存指定文件的修改
如何使用 git stash 贮存单个或多个文件
3257 0
|
前端开发 JavaScript API
【微前端】single-spa 到底是个什么鬼(下)
说起微前端框架,很多人第一反应就是 single-spa。但是再问深入一点:它是干嘛的,它有什么用,可能就回答不出来了。 一方面没多少人研究和使用微前端。可能还没来得及用微前端扩展项目,公司就已经倒闭了。 另一方面是中文博客对微前端的研究少之又少,很多文章只是简单翻译一下官方文档,读几个API,放个官方的 Demo 就完事了。很少有深入研究到底 single-spa 是怎么一回事的。这篇文章将不会聊怎么搭建一个 Demo,而是会从 “Why” 和 “How” 的角度来聊一下官方文档的都讲了哪些内容,相信看完这篇文章就能看懂 官方的 Demo 了。
【微前端】single-spa 到底是个什么鬼(下)
|
JavaScript 前端开发 开发者
基于webpack的热重载live reload和热更新HMR(中)
在前端应用框架中不管是react还是vue,官方都提供了相应的脚手架方便开发者快速入手,当我们在开发时修改某个js或者css文件时,webpack会自动编译我们的文件,我们刷新浏览器就可以看到编译后的文件。为此我们会想,如果我们修改保存之后,文件被编译、浏览器自动刷新、或者浏览器局部刷新(不刷新整个浏览器),这样的话多好。当然,基于webpack打包工具的相关库已经实现了。下面对此部分流程做简单的分析
|
SQL 存储 Oracle
Oracle的视图,索引,约束,事务,数据库范式
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
116 0
Oracle的视图,索引,约束,事务,数据库范式
|
SQL Devops 数据库
阿里数据库DevOps最佳实践
DevOps已不再陌生,但目前业界主要集中在开发与运维的高效协作和快速发布上,而作为企业核心资产的数据库,其结构设计、SQL审核、变更发布已成为企业效率提升的主要瓶颈,这篇文章将详细介绍阿里在数据库DevOps上遇到的挑战以及解决方案。
7788 1
|
6天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
144839 10

热门文章

最新文章