文档参考:programmercarl.com
704.二分查找
二分查找适用于一个有序并且其中元素不重复的数组
二分查找有两种写法:左闭右闭,左闭右开
左闭右闭
class Solution_one(object):
def search(self, nums, target):
left = 0 #左区间
right = len(nums) - 1 #右区间
middle = left + (right - left)/2 #求中位数
while(left <= right):
if (nums[middle] < target):
left = middle + 1 #区间变为[middle + 1, right]
elif (nums[middle] > target):
right = middle - 1 #区间变为[left, middle - 1]
else:
return middle
middle = left + (right - left)/2
return -1 #没查出结果,返回-1
左闭右开
class Solution(object):
def search(self, nums, target):
left = 0
right = len(nums)
while (left < right):
middle = left + (right - left) / 2
if (nums[middle] < target):
left = middle + 1
elif (nums[middle] > target):
right = middle
else:
return middle
return -1
其实我能明白怎么写,但是我不知道该怎么解释这个逻辑,hh
这里我唯一感到惊奇的思路是计算middle时,利用left + (right - left) / 2这个地方,为了防止溢出问题,居然还可以这样
27.移除元素
移除元素,也就是删除元素,平常我都是两个for循环暴力破解,这次倒是学到了新方法——双指针法;
class Solution(object):
def removeElement(self, nums, val):
head, tail = 0, 0
for i in range(len(nums)):
while nums[head] == val:
head += 1
if head > len(nums) - 1:
return tail
nums[tail] = nums[head]
if head < len(nums) - 1:
head += 1
tail += 1
else:
return tail + 1
这个版本不是最简洁的版本,但却是我自己看懂那个小动画后,自己动手写出来的,虽然比较粗糙,但我比较好理解——while循环模拟head快指针一直往前走,碰到不同的值就把该值赋给tail慢指针,然后在不溢出的情况下,快指针和慢指针同时向前走一步
# 大佬版本
class Solution(object):
def removeElement(self, nums, val):
head, tail = 0, 0
list_size = len(nums)
while head < list_size:
if nums[head] != val:
nums[tail] = nums[head]
tail += 1
head += 1
return tail
上面这个就是简洁版,确实简洁,心服口服
今天就只写了这些基本的算法题,害,万恶的考试周