-
今日学习的文章链接:programmercarl.com/%E6%95%B0%E…
-
自己看到题目的第一想法: 二分法我应该会啊,结果还有哪里不对呢,经常要多次调试才能得到正确答案
-
看完代码随想录之后的想法 : 第一次看的时候感觉非常不错,有重点难点,有解释。 但是Python栈还是会有一些不完善的地方,有一些解法是没有的,但是会督促我自己去好好实现,因为有答案,就会想看答案最容易了,现在是看Java的代码考虑Python的解法是什么。
-
自己实现过程中遇到哪些困难 :暴力解法也会遇到一些问题
-
今日收获,记录一下自己的学习时长:最近生病了,还要准备搬家,一刷过也花了两天才搞完
题目链接
二分法:解法的共同点
- 大于或小于的值就不能在查找范围内了,所以left=mid+1
- mid=left+(right-left)//2,是因为mid不能超出right,//会略去余数
解法一:左闭右开
重点:left<right,等于的情况会在<时就已经比较过了,增加=会多做一次
class Solution:
def search(self, nums: List[int], target: int) -> int:
left,right=0,len(nums)
while left <right:
mid=left+(right-left)//2
if nums [mid]<target:
left=mid+1
elif nums [mid]==target:
return mid
elif nums[mid]>target:
right=mid
return -1
解法二:左闭右闭
重点:left<=right,等于的情况会在=时还没有比较,所以是有意义的
class Solution:
def search(self, nums: List[int], target: int) -> int:
left,right=0,len(nums)-1
while left <=right:
mid=left+(right-left)//2
if nums [mid]<target:
left=mid+1
elif nums [mid]==target:
return mid-1
elif nums[mid]>target:
right=mid
return -1
27.移除元素
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
#if nums=
n=len (nums)
left,right=0,n-1
i=0
while i <n:
if nums [i]==val:
for j in range (i+1,n):
nums[j-1]=nums[j]
i=i-1
n =n-1
i+=1
return n
双向指针:
注意点有点多
- 除了提前判断right是否可以赋值给left,还需要在while中判断后续的right是否能赋值给left
- left=right是有意义的因为=时还没有比较
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
n=len (nums)
left,right=0,n-1
while left<=right and right>=0 and nums [right]==val:
right=right-1
while left<=right:
if nums[left]==val:
nums[left]=nums[right]
right-=1
#if nums[left]==val:
left += 1
while right>=0 and nums[right]=val:
right-=1
return left