704.二分查找 力扣题目传送门
AC过后的感受:之前做过一次这题,当时也看到了卡哥的题解(卡哥题解传送锚点哈),感觉恍然大悟——原来自己晕的是+还是- 1的问题是区间开闭的问题。不过这次选在【left,right)这种开始写,还是出错,需要再理清楚一遍。
我感觉开闭区间主要还是在判断条件是否能等于的时候考虑,以及循环中的left+1 right-1依然是考虑到在if 判断时是否比较过这个值了 或者说是区间是否取到这个值了 取到了 那就下一个 没取到那就要取当前这个(enmmmm感觉我描述的不明不白的 但是我感觉我是真的明白了(哭笑不得.jpg))
方法一:采用[left,right)方式
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left = 0
right = len(nums)#这里因为是[left,right) 右边是开区间,所以取数组长度那个值是取不到的
# middle = (left + right)/2
# [left,right)
while(left < right):
middle = (left + right)/2
if(target < nums[middle]):
right = middle
elif(target > nums[middle]):
left = middle +1 #这里如果不进行+1 代码可能就会在一直一遍遍循环再left=middle中(调试亲测)
else:
return middle
return -1
方法二:采用[left,right]方式
对于right的初始值取值!!通过初始值取值的不同也是区分开闭区间的好方法 (这里真的是个小坑啦 明白了之后就可以“乱杀”啦)
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left = 0
right = len(nums)-1 #这里的-1要加哦 因为是闭区间,所以两端要都可以取到 这也是与[left,right)有区别的地方
# [left,right]
while(left <= right):
middle = (left + right)/2
if(target < nums[middle]):
right = middle-1 #要保证端点的值是可以取到的
elif(target > nums[middle]):
left = middle +1 #同上哈
else:
return middle
return -1
27.元素移除(力扣题目传送门)
尽管之前已经做过一次啦 也了解过快慢指针这个东西,但是第一想法还是暴解
方法一:暴力解法
(小插曲:之前第一次写这个题是用C++写的,嵌套循环还挺容易整出来的,这次用太久没捡起来用的python写给我绕进去了
笑死,系统刷题第一天,败在python的for循环上 不可以!!)
debug时发现了for循环困住了i,我还没想到如果还用for要怎么实现,看到群里刚好有人讨论说用while会容易控制i一些
下面试AC的暴力解决的代码啦(有很多代码书写可能不够规范(装晕.jpg(别骂啦别骂啦在改啦在改啦)))
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
l =len(nums)-1 #这里的-1和下面while 的条件要对应起来 enmmmm应该没错
i=0
while i<=l :
if nums[i]==val :
for j in range(i,l):
nums[j]=nums[j+1]
l-=1
else:
i+=1
return l+1
方法二:快慢指针
快指针负责在前面探路,遇到target就删去
慢指针善后,把每个非target的元素一个个纳入数组中
我经常晕的点!!在下面代码中有注释解释
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
size=len(nums)-1 #其实这个-1主要就是看你这个size表达的是数组的长度还是数组下标
# 如果是数组长度 那就不用-1 下面whlie控制循环那里就当然也不可以=啦
# 如果是表示下标 那就要-1啦 下面while控制循环就相应也可以=
fast=0
slow=0
while fast<=size:#因为fast负责探路嘛 所以用它来控制循环
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow