53-03 数组中数值和下标相等的元素

题目

假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{-3,-1,1,3,5}中,数字3和它的下标相等。

AcWing OJ

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
posted @ 2019-03-17 09:26  youngliu91  阅读(277)  评论(0)    收藏  举报