日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode的二分查找的练习部分总结

發布時間:2023/12/1 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 res

69.?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 = mid

74.?搜索二維矩陣


編寫一個高效的算法來搜索?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 False

81、153、154題,這三個題和33題類似,基本上是一樣的。

轉載于:https://www.cnblogs.com/andingding-blog/p/8717936.html

總結

以上是生活随笔為你收集整理的LeetCode的二分查找的练习部分总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。