題
編寫一個高效的算法來判斷 m x n 矩陣中蒋搜,是否存在一個目標值。該矩陣具有如下特性:每行中的整數(shù)從左到右按升序排列判莉。
每行的第一個整數(shù)大于前一行的最后一個整數(shù)豆挽。
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m,n=len(matrix),len(matrix[0])
m_l,m_r=0,m-1
n_l,n_r=0,n-1
#m_m=0
while m_l<m_r:
m_m=(m_l+m_r)//2
if matrix[m_m][-1]==target:
return True
elif matrix[m_m][-1]<target:
m_l=m_m+1
else:
m_r=m_m
while n_l<n_r:
n_m=(n_l+n_r)//2
if matrix[m_l][n_m]==target:
return True
elif matrix[m_l][n_m]<target:
n_l=n_m+1
else:
n_r=n_m-1
return True if matrix[m_l][n_l]==target else False
下面的題與標解相差較大
整數(shù)數(shù)組 nums 按升序排列,數(shù)組中的值 互不相同 券盅。
在傳遞給函數(shù)之前帮哈,nums 在預(yù)先未知的某個下標 k(0 <= k < nums.length)上進行了 旋轉(zhuǎn),使數(shù)組變?yōu)?[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下標 從 0 開始 計數(shù))锰镀。例如娘侍, [0,1,2,4,5,6,7] 在下標 3 處經(jīng)旋轉(zhuǎn)后可能變?yōu)?[4,5,6,7,0,1,2] 。
給你 旋轉(zhuǎn)后 的數(shù)組 nums 和一個整數(shù) target 泳炉,如果 nums 中存在這個目標值 target 憾筏,則返回它的下標,否則返回 -1 花鹅。
class Solution:
def search(self, nums: List[int], target: int) -> int:
left,right=0,len(nums)-1
while left<right:
mid=(left+right)//2
if nums[mid]>nums[left]:
if nums[mid]<target:
left=mid+1
elif nums[mid]==target:
return mid
else:
if nums[left]>target:
left=mid+1
elif nums[left]==target:
return left
else:
right=mid-1
else:
if nums[mid]==nums[left]:
ans=left if nums[left]==target else -1
ans =right if nums[right]==target else ans
#print(left,right)
return ans
if nums[mid]>target:
right=mid-1
elif nums[mid]==target:
return mid
else:
if nums[right]>target:
left=mid+1
elif nums[right]==target:
return right
else:
right=mid-1
'''
if nums[mid]<target and nums[left]:
left=mid+1
elif nums[mid]==target:
return mid
else:
if nums[left]<target:
right=mid-1
elif nums[left]==target:
return left
else:
left=mid+1
'''
ans=left if nums[left]==target else -1
ans =right if nums[right]==target else ans
#print(left,right)
return ans
標解
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums:
return -1
l, r = 0, len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
return mid
if nums[0] <= nums[mid]:
if nums[0] <= target < nums[mid]:
r = mid - 1
else:
l = mid + 1
else:
if nums[mid] < target <= nums[len(nums) - 1]:
l = mid + 1
else:
r = mid - 1
return -1
作者:LeetCode-Solution
鏈接:https://leetcode-cn.com/problems/search-in-rotated-sorted-
array/solution/sou-suo-xuan-zhuan-pai-xu-shu-zu-by-leetcode-solut/
來源:力扣(LeetCode)
著作權(quán)歸作者所有氧腰。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處刨肃。
對深入理解二分有幫助
給定一個按照升序排列的整數(shù)數(shù)組 nums古拴,和一個目標值 target。找出給定目標值在數(shù)組中的開始位置和結(jié)束位置真友。
如果數(shù)組中不存在目標值 target黄痪,返回 [-1, -1]。
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if len(nums)==0:
return [-1,-1]
left,right=0,len(nums)-1
for i in range(2):
tl,tr=0,right
while tl<tr:
mid=(tl+tr)//2 if i==0 else (tl+tr+1)//2
#mid=(tl+tr)//2
if nums[mid]==target:
if i==0:
#print('0 {}'.format(mid))
tr=mid
else:
#print('1 {}'.format(mid))
tl=mid
elif nums[mid]>target:
tr=mid-1
else:
tl=mid+1
if i==0:
left=tl
else:
#print("hi")
right=tr
return [left,right] if nums[left]==target else [-1,-1]
關(guān)于優(yōu)化時間復(fù)雜度和空間復(fù)雜度的想法
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
#cost.append(0)
#ans,n=cost[:2],len(cost)
a,b=cost[:2]
n=len(cost)
for i in cost[2:]:
a,b=b,min(a,b)+i
return min(a,b)
已知一個長度為 n 的數(shù)組盔然,預(yù)先按照升序排列桅打,經(jīng)由 1 到 n 次 旋轉(zhuǎn) 后,得到輸入數(shù)組愈案。例如挺尾,原數(shù)組 nums = [0,1,2,4,5,6,7] 在變化后可能得到:
若旋轉(zhuǎn) 4 次,則可以得到 [4,5,6,7,0,1,2]
若旋轉(zhuǎn) 7 次刻帚,則可以得到 [0,1,2,4,5,6,7]
注意潦嘶,數(shù)組 [a[0], a[1], a[2], ..., a[n-1]] 旋轉(zhuǎn)一次 的結(jié)果為數(shù)組 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
給你一個元素值 互不相同 的數(shù)組 nums ,它原來是一個升序排列的數(shù)組掂僵,并按上述情形進行了多次旋轉(zhuǎn)航厚。請你找出并返回數(shù)組中的 最小元素 。
class Solution:
def findMin(self, nums: List[int]) -> int:
left,right=0,len(nums)-1
if nums[-1]>=nums[0]:
return nums[0]
while left<right:
mid=(left+right)//2
if nums[mid]<nums[0]:
right=mid
else:
left=mid+1
return nums[left]