3. First Position.Binary Search/二分查找第一次出现位置

Notes : 

首先是一篇博客

/*我觉得这篇文章里的二分查找法不能找到target第一次出现的位置,因为return的是mid,mid很有可能不是第一个==target的数

二分查找法的实现和应用汇总

1. 主要是解决在“一堆数中找出指定的数”这类问题。

2. 而想要应用二分查找法,这“一堆数”必须储存在数组中并且有序排列。如果是用链表存储的话,就无法在其上应用二分查找法

因为链表的每一个节点的地址不能在O(1)的时间复杂度内获得。知乎

3. 递增还是递减无所谓,数组中是否存在相同的元素也无所谓。

4. 这题好烦啊

---------------------------------------------------------------------------------------------------------------------

题目:

For a given sorted array (ascending order) and a target number, find the first index of this number in O(log n) time complexity.

If the target number does not exist in the array, return -1.

Example

If the array is [1, 2, 3, 3, 4, 5, 10], for given target 3, return 2.

 ========================================================

我的想法:

既然是要O(log(n)),那就是要不断划分子集再再子集里寻找。到目前为止一般看到log(n)应该都是log2(n),所以首先想到的应该是对半分(假设我不知道这是要让我用二分法)。

那么给定一个数列 [1,2,3,4,5,7,9,23,52],要找一个给定的数x,那我就应该把数列分成两半([1,2,3,4]; [5,7,9,23,52])//数列长度不是偶数的话多出来那个随便放哪边都行。 

然后用x和左边的最大值还有右边的最大值比,x比左边最大还大的话,那就只有右边的subset可能包含它。

那怎么实现这个不看左边只看右边了呢?因为要return这个x的位置,所以我不能直接把数列砍掉一半,那我就只能用我自己创建的变量left和 right来改变我要看的范围了。因为left和right之后我也不用return,所以随便改都无所谓。所以每次我发现x比某一边大/小,我就把那一边的极限值(left或者right)改成这个当前的中间值,然后再新的范围分成两半就好了。

一直重复到精确到最小的set。因为我们要找x出现的第一个位置,所以不能在nums[mid]==x的时候就return

=========================================================

我的码:

class Solution:
    """
    @param nums: The integer array.
    @param target: Target to find.
    @return: The first position of target. Position starts from 0.
    """
    def binarySearch(self, nums, target):
        # write your code here
        # 最大的范围
        left, right = 0, len(nums)
        while left + 1 < right :
            mid = (left + right) // 2
            if nums[mid] < target:
                # 缩小范围
                left = mid
            else :
                right = mid
        #范围最小了,看有没有
        if nums[left] == target :
            return left
        elif nums[right] == target :
            return right
        # 找完了还没找到, return-1
        return -1;

在这里没用recursion因为parameter是规定好的,如果要用recursion那我就得把index作为parameter传着走。




                                   

你可能感兴趣的:(数据结构)