LintCode Python 簡單級題目 經典二分查找問題


原題描述:

在一個排序數組中找一個數,返回該數出現的任意位置,如果不存在,返回-1

樣例

給出數組 [1, 2, 2, 4, 5, 5].

  • 對於 target = 2, 返回 1 或者 2.
  • 對於 target = 5, 返回 4 或者 5.
  • 對於 target = 6, 返回 -1.

挑戰:

  O(logn) 的時間

鏈接:

  http://www.lintcode.com/zh-cn/problem/classical-binary-search/

題目分析:

1.給出一個有序數組以及一個目標值target,

2.要求返回target在數組中的位置,若數組里不存在target,則返回-1。

套用經典的二分查找模板即可:

 

class Solution:
    # @param {int[]} A an integer array sorted in ascending order
    # @param {int} target an integer
    # @return {int} an integer
    def findPosition(self, A, target):
        # Write your code here
        begin = 0
        end = len(A)-1
        n = len(A)
        
        if n == 0:
            return -1
        
        while begin < end:
            mid = begin + (end-begin)/2
            if A[mid] == target:
                return mid
            elif A[mid] < target:
                begin = mid + 1
                end = end
                continue
            else:
                end = mid - 1
                begin = begin
                continue
        
        if A[begin] == target:
            return begin
        if A[end] == target:
            return end
        return -1

題目進階:

1.給定一個排序的整數數組(升序)和一個要查找的整數target

2.用O(logn)的時間查找到target第一次出現的下標(從0開始),

3.如果target不存在於數組中,返回-1

題目分析:

經典問題中返回為target的任意位置,此題變化為要求返回列表中的第一個位置;

沿用經典方案,查找到target的任一位置之后,索引自減,直至target不等於索引值;

返回索引+1即可。

class Solution:
    # @param {int[]} A an integer array sorted in ascending order
    # @param {int} target an integer
    # @return {int} an integer
    def binarySearch(self, A, target):
        # Write your code here
        begin = 0
        end = len(A)-1
        n = len(A)
        
        if n == 0:
            return -1
        
        while begin < end:
            mid = begin + (end - begin)/2
            if A[mid] == target:
                while A[mid] == target:
                    mid = mid - 1
                return mid + 1
            elif A[mid] < target:
                begin = mid + 1
                end = end
                continue
            else:
                end = mid - 1
                begin = begin
                continue
        
        if A[begin] == target:
            return begin
        if A[end] == target:
            return end
        return -1

PS:

  如果是最后一個位置,索引自增,返回所以-1~

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM