1. 程式人生 > >leetcode的python實現 刷題筆記35:搜尋插入位置的暴力解法和優化解法

leetcode的python實現 刷題筆記35:搜尋插入位置的暴力解法和優化解法

 

給定一個排序陣列和一個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。

你可以假設陣列中無重複元素。

示例 1:

輸入: [1,3,5,6], 5
輸出: 2

示例 2:

輸入: [1,3,5,6], 2
輸出: 1

示例 3:

輸入: [1,3,5,6], 7
輸出: 4

示例 4:

輸入: [1,3,5,6], 0
輸出: 0
class Solution:
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if len(nums) == 0:
            return None
        # 實現查詢到的結果,有就返回當前位置
        for i in range(0,len(nums)):
            if nums[i] == target:
                return i
        # 實現查詢到的結果,沒有時應該放到哪裡
        for i in range(0,len(nums)):
            if len(nums) >1:
                if nums[i] < target and nums[i+1] >target:
                    return i+1
                elif nums[0]>target:
                    return 0
                elif nums[-1]<target:
                    return len(nums)
            else:
                if nums[0]>target:
                    return 0
                else:
                    return len(nums)

sl = Solution()
print(sl.searchInsert([1,3,5,6], 5))
print(sl.searchInsert([1,3,5,6], 2))
print(sl.searchInsert([1,3,5,6], 7))
print(sl.searchInsert([1,3,5,6], 0))

class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        left = 0
        right = len(nums)
        while left < right:
            mid = left + (right - left) // 2
            if nums[mid] > target:
                right = mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                return mid
        return left

sl = Solution()
print(sl.searchInsert([1,3,5,6], 5))
print(sl.searchInsert([1,3,5,6], 2))
print(sl.searchInsert([1,3,5,6], 7))
print(sl.searchInsert([1,3,5,6], 0))

 

總結:

思路:

1.第一種解法:比較暴力,不需要怎麼動腦筋,只需要把可能出現的情況一一列舉出來即可。

首先判斷下進來的陣列是否為空陣列,如果是,就返回None。

接著遍歷整個陣列,如果出現相同的數字,就返回該數字的索引。

如果沒有的話就進入第二個遍歷,如果陣列大小為1,直接比較當前數字大小,然後返回相對應的索引即可。如果陣列大小大於1,這個時候就要考慮三種情況了,插入前面(返回0),後面(返回陣列大小值),還是中間(返回當前索引的下一個索引)。

2.第二種解法:這就稍微死點腦細胞了。二分查詢的思想,先找到中間值,然後判斷中間值與target的大小來判斷target應該放在中間值的左邊還是右邊,依次類推,直到找到合適的位置。

首先設定一個最左值和最右值,用於中間值。之所以採用的是mid = left + (right - left) // 2,是為了防止溢位。

然後呢使用while迴圈來比較,

如果中間值等於target,非常好,返回當前中間值得索引;

如果中間值小於target,說明target應該插在中間值的右邊,於是就將最左值變成中間值+1,最右值不變,再次找到新的中間值和target進行比較,直到找到合適的位置。

如果中間值大於target,說明target應該插在中間值的左邊,於是就將最左值不變,最右值變成中間值,再次找到新的中間值和target進行比較,直到找到合適的位置。

要注意的點:

1.python3中//返回的是整數,/返回的是浮點數。

2.在一般印象中,我們找中間值都是這樣找的,mid = (left + right) / 2。但是left與right之和超過了所在型別的表示範圍的話,那麼mid就不會得到正確的值,也就是我們常常說的溢位。所以為了避免這個問題,記得以後找中間值應該是這樣:mid = left + (right - left) / 2

3.當完成一個演算法的時候,光是得到答案是不行的,還要考慮下資料量帶來的時間複雜度。