不动点

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

说在前面

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

问题描述

给定已经按 升序 排列、由不同整数组成的数组 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
easyexcel 索引
easyexcel读取合并单元格
easyexcel读取合并单元格
6347 1
easyexcel读取合并单元格
|
24天前
|
消息中间件 存储 Kafka
流、表与“二元性”的幻象
本文探讨流与表的“二元性”本质,指出实现该特性需具备主键、变更日志语义和物化能力。强调Kafka与Iceberg因缺乏更新语义和主键支持,无法真正实现二元性,唯有统一系统如Flink、Paimon或Fluss才能无缝融合流与表。
116 7
流、表与“二元性”的幻象
|
安全 Java 数据安全/隐私保护
如何配置 Java 安全管理器来避免访问控制异常
配置Java安全管理器以防止访问控制异常,需在启动JVM时通过 `-Djava.security.manager` 参数启用,并设置安全策略文件,定义权限规则,限制代码执行操作,确保应用安全。
905 1
|
存储 算法 安全
(八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析
在《GC分代篇》中,我们曾对JVM中的分代GC收集器进行了全面阐述,而在本章中重点则是对JDK后续新版本中研发推出的高性能收集器进行深入剖析。
962 12
|
存储 开发工具 git
解决“hint: the same ref. If you want to integrate the remote changes, usehint: ‘git pull‘ before pus”
解决“hint: the same ref. If you want to integrate the remote changes, usehint: ‘git pull‘ before pus”
439 3
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构
|
存储 JSON 算法
新手避坑:盘点使用ClickHouse最容易犯的12个错误
在这篇文章中,我们突出了新手用户遇到的最常见的12个问题,这些问题是由于在使用ClickHouse的过程中,不遵循最佳实践,甚至反最佳实践而导致的。对于每一个问题,我们都推荐了一个解决方案或正确的使用方法。
8724 18
新手避坑:盘点使用ClickHouse最容易犯的12个错误
|
存储 人工智能 安全
阿里云oss简介和如何对接使用
阿里云对象存储服务(Alibaba Cloud Object Storage Service,简称OSS)是阿里云提供的一种安全、稳定、高效的对象存储服务。它支持多元数据存储、持久化存储和共享访问,并且具有无限的扩展性和备份恢复能力。阿里云OSS适用于各类场景,如云计算、大数据分析、人工智能等,并且具备高可用性、高可扩展性和低成本等优势。
15390 2
数据结构学习笔记——链式存储结构实现队列(链队)
数据结构学习笔记——链式存储结构实现队列(链队)
数据结构学习笔记——链式存储结构实现队列(链队)
|
存储 算法 安全
面试官:说一下你常用的加密算法
加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。
5671 0