剑指offer 57. 数组中数值和下标相等的元素

简介: 剑指offer 57. 数组中数值和下标相等的元素

题目描述


假设一个单调递增的数组里的每个元素都是整数并且是唯一的。

请编程实现一个函数找出数组中任意一个数值等于其下标的元素。

例如,在数组 [−3,−1,1,3,5] 中,数字 3 和它的下标相等。



数据范围

数组长度 [1,100]。

样例

输入:[-3, -1, 1, 3, 5]
输出:3
• 1
• 2
• 3

注意:如果不存在,则返回-1。


方法一:二分查找 O(logn)


因为数组中至少有一个数是其值等于其所在下标的,且该数组是递增的,所以可以以第一个数值等于其下标的数为分界线,其左边所有数的数值都一定小于其下标,而其右边所有数都一定大于等于其下标。


特殊情况: 如果不满足上述条件,则说明该数组中没有出现一个数值等于下标的数,直接返回 -1 即可。

因此,我们可以通过上面的划分条件进行二分,找到第一个数值等于下标的那个元素,如果没有则返回 -1

class Solution {
public:
    int getNumberSameAsIndex(vector<int>& nums) {
        int l = 0, r = nums.size() - 1;
        while (l < r)
        {
            int mid = l + r >> 1;
            if (nums[mid] >= mid)    r = mid;
            else    l = mid + 1;
        }
        if (nums[l] == l)  return l;
        return -1;
    }
};

欢迎大家在评论区交流~

目录
相关文章
|
11月前
|
算法
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
|
29天前
(剑指Offer)04、二维数组中的查找11、旋转数组的最小数字50、第一个只出现一次的字符(2021.12.02)
(剑指Offer)04、二维数组中的查找11、旋转数组的最小数字50、第一个只出现一次的字符(2021.12.02)
28 1
|
5月前
|
C++
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
|
6月前
|
Python C++ Java
C/C++每日一练(20230405) 数组元素循环右移、输出字符图形、移除链表元素
C/C++每日一练(20230405) 数组元素循环右移、输出字符图形、移除链表元素
43 0
C/C++每日一练(20230405) 数组元素循环右移、输出字符图形、移除链表元素
|
6月前
|
存储 算法 Java
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
85 0
|
前端开发
数组下标对应缺位问题
数组下标对应缺位问题
44 0
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
leetcode 215 数组中的第k个最大元素
leetcode 215 数组中的第k个最大元素
106 0
leetcode 215 数组中的第k个最大元素
LeetCode 1464. 数组中两元素的最大乘积
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。
71 0
|
测试技术
LeetCode 1551. 使数组中所有元素相等的最小操作数
存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n )。
109 0