今天下班回来开始得比较晚,九点半才开始学,因为这部分之前刷过一遍,所以跳过数组基础,直接开始刷题了
704二分查找这道题,起初第一次看到搜索元素,就想到直接搜索,用循环遍历nums数组,找到target就返回数组下标,但是这样时间复杂度相对较高
题目中有序数组,利用有序可以直接缩短查找范围,快速找到目标值,于是凭着之前刷题的记忆,写下如下python代码
def search(self,nums,target):
left=0
right=len(nums)-1#数组最长下标=长度-1
while(left<=right):
i = (left + right) // 2
if nums[i]<target:
left=i
elif nums[i]>target:
right=i
else:
return i
return -1
但是结果超出时间限制(1/47,哭死),最后执行输入是[-1,0,3,5,9,12] 2
通过debug发现,最后卡在left=1,right=2的地方,在循环一次,i=1,但nums[i]=0<target,接下去left=1,那么left就在1无限循环了
所以left和right应该分别更新为i+1,i-1,这样就不会出现此情况了,最终AC代码如下:
def search(self,nums,target):
left=0
right=len(nums)-1#数组最长下标等于长度-1
while(left<=right):
i = (left + right) // 2
if nums[i]<target:
left=i+1
elif nums[i]>target:
right=i-1
else:
return i
return -1
45分钟写完第一题,然后开始27. 移除元素 ;
首先是暴力解法:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
lenth=len(nums)
i=0
while(nums[i]):
if nums[i]==val:
lenth-=1
j=i
while(nums[j+1]):
nums[j]=nums[j+1]
j+=1
i+=1
return (lenth,nums)
第一次提交,提示数组越界,错误在于while(nums[j+1]),本意是想判断,下一个元素存在;后边又一想,长度也在不停变化,用这种方法判断结束,肯定不正确
当i已经到数组最后值时,nums[j+1]会越界,所以将结束条件改为while(j<lenth),外层循环同理:
暴力解法第二个问题,如果i+1没有条件都+1的话,在删除操作后,会有元素漏删,所以,改为以下代码:
lenth=len(nums)
i=0
while(i<lenth):
if nums[i]==val:
lenth-=1
j=i
while(j<lenth):
nums[j]=nums[j+1]
j+=1
else:
i+=1
return lenth
暴力解法AC,接下来是双指针法,虽然之前刷过一遍,但是只记得需要两个指针指向,具体的全忘记了,所以直接看了文章解说:
基本思路:fast--需要更新的元素slow--需要更新的坐标
不断让nums[slow]=nums[fast]