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