二分查找總結及部分Lintcode題目分析 3

Search in rotated sorted array,題目中也給出了相應的例子,就是在sorted array某個節點發生了翻轉(ie.0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2)。因此咱們能夠把這個sorted array 分紅兩部分看,一部分是左半部分的上升區間,而後是最小值,一部分是右半部分的上升區間。以及考慮其中的特例就是翻轉後還是原來的array,一個連續的上升區間。python

1. Find Minimum in Rotated Sorted Array數組

解題思路:要找到最小值的話,首先要定一個參考的值,即target是什麼。咱們以數組尾做爲target,來進行比較,先鎖定是右半部分的上升區間,再在這個上升區間中找最小值。找到比num[end]的值要小的不返回而是進一步縮小範圍。spa

class Solution:
    # @param num: a rotated sorted array
    # @return: the minimum number in the array
    def findMin(self, num):
        # set the last element as target, and find the second ascending period
        start = 0
        end = len(num) - 1
        while start + 1 < end:
            mid = start + (end - start) / 2
            if num[mid] <= num[end]:
                end = mid
            else:
                start = mid
        return min(num[start],num[end])

 

2. Search in rotated sorted arraycode

這道題聽說是檢驗你是否真的會二分法的題目~由於target已經給出了,那咱們的判斷標準就比以前找最小值要多了個判斷。以target和end的比較,target和mid的比較,以及這個mid落到了哪一個上升區間來比較~blog

class Solution:
    """
    @param A : a list of integers
    @param target : an integer to be searched
    @return : an integer
    """
    def search(self, A, target):
        if A is None or len(A) == 0:
            return -1
        start = 0
        end = len(A) - 1
        while (start + 1 < end):
            mid = start + (end - start) / 2
            if A[mid] == target:
                return mid
            elif A[end] < A[mid]:
                if A[end] < target and target <= A[mid]:
                    end = mid
                else:
                    start = mid
            else:
                if A[mid] <= target and target <= A[end]:
                    start = mid
                else:
                    end = mid
        if A[end] == target:
            return end                    
        if A[start] == target:
            return start
        
        return -1
相關文章
相關標籤/搜索