LeetCode 704.二分查找
题目链接
思路
一开始想着用python内置函数:nums.index(target),后面神奇的通过了以后觉得太作弊了,然后才想着不行得二分一下。
(原来)
class Solution:
def search(self, nums: List[int], target: int) -> int:
if target in nums:
return nums.index(target)
else :
return -1
才知道二分查找,源头是确定区间(左闭右闭 / 左闭右开),由此确定left能不能=right,和right是=middle还是middle-1,最后return找middle就完了,找到就是middle,找不到就返回-1
以下是左闭右闭的:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left<=right :
middle = left + (right - left) // 2
if nums[middle] < target :
left = middle + 1
elif nums[middle] > target :
right = middle - 1
else:
return middle
return -1
以下是左闭右开的:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)
while left < right:
middle = left + (right - left) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle
else:
return middle
return -1
反思
缺点:总是记不住middle要写到哪里去,会漏掉或者写出while去。可能还是要多练几遍
一开始连left right都忘记了,还有这茬子事儿呢,是太久没接触了,🐖脑子
二分查找比较适用于有序的,最好是单一的(能有重复元素吗?试了一下测试用例,好像不能重复的亚子)数组做查找
LeetCode 27.移除元素
题目链接
思路
第一反应就是暴力,for一个找元素,for一个移元素,然后把,没通过
(原来的)
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
lens = len(nums)
for i in range(len(nums)):
if nums[i] == val:
for j in range(i, len(nums)-1):
nums[j] = nums[j+1]
lens -= 1
i -= 1
return lens
搂两眼debug发现,是range的问题,第一把i=0,-1了应该第二把还是0才对(我理想的),结果第二把i=1了,说明不能用range,-1不起作用。尝试了各种方式,发现python里面又只能写range(当然有其他办法就是我这等小趴菜没搜到)又没法-1,行吧,把第一个for换成while试试:
def removeElement(self, nums: List[int], val: int) -> int:
i = 0
lens = len(nums)
while (i >= 0) and (i< lens):
if nums[i] == val:
for j in range(i, len(nums)-1):
nums[j] = nums[j + 1]
lens -= 1
else:
i += 1
return lens
尝试了几遍,终于是过了。。。。
卡哥的意思是用双指针的思想,试下:
def removeElement(self, nums: List[int], val: int) -> int:
fast, slow = 0, 0
while fast < len(nums):
if nums[fast] != val:
nums[slow] = nums[fast]
fast += 1
slow += 1
else:
fast += 1
return slow
可以,一整个干净利落,过了
反思
目前的理解是双指针,一个表示新数组的元素(fast),一个表示新数组的元素位置(slow),把fast指到的需要的元素(跟val不相等的元素)丢到slow里面去,重新排一个数组,完了这个数组长度就是slow,return slow就完了
双指针好像对这种需要两个for 的,for1for2的这种会比较有用吧,多做几道题可能我这个想法会被推翻?噶油宝子