今天是第一天跟随大家一起刷题,我自认为我的算法基础不够牢固,虽然已经工作了,但是还是有很多的机会用到数据结构的知识,于是决定将秋招春招没刷够的题捡回来。
第一次看到这个题觉得很简单很简单,但是还是翻车了。我按照代码随想录的建议,第一遍只刷一种方法并且学会。这道题我想按照左闭右开的方法去做,一切都很丝滑,直到循环中的一个细节没注意导致死循环。当:
target > nums[mid]
新生成的区间范围也应该是左闭右开的。并且由于nums[mid]也参与了比较,左区间就不能再用这个位置了,因此左区间应该这样变化:
left = mid + 1
不能直接将mid赋值给left!
完整题解代码如下:
class Solution(object):
def search(self, nums, target):
left, right = 0, len(nums)
while left < right:
mid = left + (right - left) // 2
if target < nums[mid]:
right = mid
elif target > nums[mid]:
left = mid + 1
else:
return mid
return -1
因为之前在学习判断环形链表的时候,学过快慢指针,虽然这道题题解没有细讲快慢指针,但是他点出了精髓就是通过快慢指针,代替一个for循环。这个思路还是比较受用的所以我选择用快慢指针来写。
由于我发现快指针在这道题类似于遍历数组的每个索引的作用,因此我选择了用for in循环来代替快指针的赋值功能。代码如下:
class Solution(object):
def removeElement(self, nums, val):
slow = 0
for num in nums:
if val != num:
nums[slow] = num
slow += 1
return slow