53-03 数组中数值和下标相等的元素
题目
假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{-3,-1,1,3,5}中,数字3和它的下标相等。
C 语言题解
由于数组是单调递增排序的,因此我们可以尝试二分查找算法来进行优化。假设我们某一步抵达数组中的第i个数字。如果我们很幸运,该数字的值刚好也是i,那么我们就找到了一个数字和其下标相等。
当数字的值和下标不相等的时候,假设数字的值为m:
先考虑m大于i的情形,即数字的值大于它的下标。由于数组中的所有数字都唯一并且单调递增,如果第i个数字的值大于i,那么它的右边的数字都大于对应的下标,我们都可以忽略。下一轮查找只需要从它左边的数字中查找即可。
数字的值m小于它的下标i的情形和上面类似。它左边的所有数字的值都小于对应的下标,也可以忽略。
int GetNumberSameAsIndex(const int* numbers, int length)
{
if (numbers == nullptr || length <= 0)
return -1;
int left = 0;
int right = length - 1;
while (left <= right)
{
int middle = left + ((right - left) >> 1);
if (numbers[middle] == middle)
return middle;
if (numbers[middle] > middle)
right = middle - 1;
else
left = middle + 1;
}
return -1;
}
C++ 题解
class Solution {
public:
int getNumberSameAsIndex(vector<int>& nums) {
int left=0,right=nums.size()-1;
if(right<0)
return -1;
while(left <= right)
{
int mid = (left+right)/2;
if(nums[mid] == mid)
return mid;
else if(nums[mid] > mid)
right = mid -1;
else
left = mid +1;
}
return -1;
}
};
python 题解
class Solution(object):
def getNumberSameAsIndex(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if nums == []:
return -1
left = 0
right = len(nums) - 1
while(left <= right):
middle = (left + right) >> 1
if nums[middle] == middle:
return middle
elif nums[middle] < middle:
left = middle + 1
else:
right = middle - 1
return -1

浙公网安备 33010602011771号