LeetCode的二分查找的练习部分总结
這兩天由于工作的原因,一直沒有寫博客,但是卻把LeetCode上面的題目做了不少——二分查找。上面這些題都是這兩天寫的?,F在簡單做一個總結。
首先二分查找的思想就是對一個有規律的元素(事情)進行不斷的排除,最后找到符合自己想要的結果。這種排除的時間復雜度是log2(n)級別的,查詢的速度非???。
?
33.?搜索旋轉排序數組
假設按照升序排序的數組在預先未知的某個關鍵點上旋轉。
(即?0 1 2 4 5 6 7?將變成?4 5 6 7 0 1 2)。
給你一個目標值來搜索,如果數組中存在這個數則返回它的索引,否則返回 -1。你可以假設數組中不存在重復。
思路:很簡單的想法是直接一個循環遍歷了,這樣的時間復雜度是n。但是可以優化一下,這是一個旋轉的序列,但是還是有兩部分是有序的。
1、利用target數和數組第一個數比較大小,如果target比較小,就從后面往前遍歷。
2、否則直接遍歷。
代碼:
class Solution:def search(self, nums, target):if len(nums)>0 and target <= nums[0]:if target == nums[0]:return 0for i in range(len(nums),-1,-1):if nums[i] == target:return ielse:for i in range(0,len(nums)):if nums[i] == target:return ireturn -1?
34.?搜索范圍
給定一個已經升序排序的整形數組,找出給定目標值的開始位置和結束位置。
你的算法時間復雜度必須是?O(log?n) 級別。
如果在數組中找不到目標,返回?[-1, -1]。
例如:
給出?[5, 7, 7, 8, 8, 10]?和目標值 8,
返回?[3, 4]。
?
代碼:
class Solution:def searchRange(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""lift = 0right = len(nums)-1while lift<=right:mid = (right + lift)//2if nums[right] == target:breakif nums[mid] > target:right = mid - 1else:lift = mid + 1lift = 0while lift<=right:mid = (right + lift)//2if nums[lift]==target:breakif nums[mid] >target:right = mid - 1else:lift = lift + 1if lift > right:return [-1,-1]else:return [lift,right]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"""for i in range(0,len(nums)):if nums[i] >= target:return ireturn len(nums)50.?Pow(x, n)
實現?pow(x,?n)。
示例 1:
輸入: 2.00000, 10 輸出: 1024.00000示例 2:
輸入: 2.10000, 3 輸出: 9.26100 class Solution:def myPow(self, x, n):i = n #將n取絕對值的部分,如果n是負數,可以做在最后將結果取反。if n < 0:i = -nres = 1.0while i:#利用i控制循環的次數if i%2!=0:#如果i是一個奇數,將單獨乘以一個xres = res * xx = x * x#x等于x的平方i = i // 2#對i取一半if n < 0:res = 1/res#對結果取反return res69.?x 的平方根
實現?int sqrt(int x)?函數。
計算并返回?x?的平方根。
x?保證是一個非負整數。
案例 1:
輸入: 4 輸出: 2案例 2:
輸入: 8 輸出: 2 說明: 8 的平方根是 2.82842..., 由于我們想返回一個整數,小數部分將被舍去。 class Solution:def mySqrt(self, x):""":type x: int:rtype: int"""if x == 1:return 1right = xlift = 0while True:mid = lift +(right - lift)//2if lift*lift<=x and right*right>=x and (right - lift)<=1:return midelse:if mid*mid>x:right = midelse:lift = mid74.?搜索二維矩陣
編寫一個高效的算法來搜索?m?x?n?矩陣中的一個目標值。該矩陣具有以下特性:
- 每行中的整數從左到右排序。
- 每行的第一個整數大于前一行的最后一個整數。
例如,
以下矩陣:
[[1, 3, 5, 7],[10, 11, 16, 20],[23, 30, 34, 50] ]給定?目標值=?3,返回?true。
class Solution:def searchMatrix(self, matrix, target):""":type matrix: List[List[int]]:type target: int:rtype: bool"""li = list()for i in matrix:li = li + ilift = 0right = len(li)-1while lift <= right:mid = lift + (right - lift)//2if li[mid] < target:lift = mid + 1elif li[mid] > target:right = mid - 1else:return Truereturn False81、153、154題,這三個題和33題類似,基本上是一樣的。
轉載于:https://www.cnblogs.com/andingding-blog/p/8717936.html
總結
以上是生活随笔為你收集整理的LeetCode的二分查找的练习部分总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 故障公告:IIS应用程序池停止工作造成博
- 下一篇: NOIP 2012 Day2