1.二分查找
思路:
将一个有序的范围,不断对半缩小,从而缩短查找时间
第一想法:
想直接把范围对半分开,但是忽略了这是一个动态的过程,二分之后,如果没有找到目标值,会再次进行二分,直到找到目标值,或者范围已经缩小到0
看完代码随想录:
明白这是一个动态过程,并且学会如何改变左右指针的值来缩小范围,以及如何处理不同边界问题的二分查找
代码
第一种(左闭右闭)
class Solution:
def search(self, nums: List[int], target: int) -> int:
right,left=len(nums)-1,0
while left<=right:
mid=(right+left)//2#注意//是除法运算取整
if nums[mid]==target:
return mid
elif nums[mid]<target: #中间值比目标值小,调整左指针指向中间值大一位
left =mid +1
elif nums[mid]>target:
right =mid -1
return -1
第二种(左闭右开)
class Solution:
def search(self,nums :list[int],target : int )->int:
right,left=len(nums)-1,0
while left<right :
mid =(left+right)//2
if nums[mid]>target:
right =mid
elif nums[mid]<target:
left = mid +1
else:
return mid
return -1
遇到的问题:
1.//和/的区分://除法运算后取整,/除法运算后变为浮点数
2.边界问题:当都为闭区间时,left==right时,仍然成立 例子:最后剩下两个数,中间值的下标索引为1,此时未找到目标值,把左指针向右调整1,此时left==right但当有一边为开区间时left==right的情况就不成立,类比前边的例子在调整指针时,不可以调整到中间值的两边,而是等于中间值的下标索引,否则在极限情况,只有两个元素时会导致左右指针,指向区间两边不包含的数
2.移除元素
思路:
1.暴力:
先一个循环查找要移除的元素,再一个循环移除元素
2.双指针:
快慢指针,慢指针跟随快指针移动,快指针查找要移除的元素,慢指针指向要更改的元素,慢指针接收快指针指向的非移除元素,当指向移除元素时通过慢指针原地踏步一次,拒绝接收要移除的元素,从而移除元素
第一想法:
没有想到快慢指针,想到暴力
看完代码随想录:
明白了双指针思路,感觉非常的巧妙
代码:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
l=len(nums)
fast,slow=0,0
while fast<l :
if nums[fast] !=val:
nums[slow]=nums[fast]
slow+=1
fast+=1
return slow
遇到的问题:
1.双指针思路及过程的理解
3.有序数组的平方:
思路:
左右指针法:
因为数组是升序排列,并且有正有负,题目要求每个数的平方,并且按照升序排列,发现负数平方后会打乱原本的顺序,发现平方的大小与绝对值有关,发现两边的绝对值相对中间较大,所以通过左右指针,寻找最大值,并且排序
第一想法:
之前做过一遍,有了第2题移除元素的左右指针思路,直接就想到了
看完代码随想录:
进一步加深思路
代码:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
size =len(nums)
left,right=0,size-1
answer=[0]*size # 1.定义列表问题
i=size-1
while left<=right:
a =nums[left]**2
b =nums[right]**2
if a<=b:
answer[i]=b #放入答案,初始i=sizee-1,是答案集的最后
i-=1
right-=1
elif a>b :
answer[i]=a
i-=1
left+=1
return answer
遇到的问题:
1.定义列表问题:因为想要使用列表的索引,把结果输入到结果集answer,但在定义时直接定义了空列表,错误出在空列表没有索引,无法通过索引操作
2.放入答案集answer的顺序:因为先查找平方值大的数,并且还要升序,所以从后向前放入答案
今日总结:
今天是第一天,对于突然提高数量的刷题节奏还不是太适应,但这也大大提高了本人的效率,加油