leetcode刷刷 | 704. 二分查找、27. 移除元素
704. 二分查找
tips:
- left, right = 0, len-1则while(left <= right),因为此时区间定义为左闭右闭的[left, right],当left==right时这个闭区间依然有效。(左闭右闭比较简单,左闭右开比较绕,需要相应改动代码)
- mid = left + ((right - left) >> 1):位移代替除法;不使用mid = (left + right) >> 1,防止溢出
- left = mid + 1;right = mid - 1。由于left和right都可取到,而mid肯定不是,因此边界直接不取mid
- 时间复杂度O(logn),空间复杂度O(1)
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 二分查找
left = 0
right = len(nums) - 1
while(left <= right):
print(left, right)
mid = left + ((right - left) >> 1) # 防止
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
27. 移除元素
tips:
- 暴力解法:时间复杂度O(n2)
- 快慢指针:时间复杂度O(n)——慢指针用来更新不等于val的数,快指针用来遍历数组
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
# 原地移除
# 暴力法:时间复杂度O(n2)
# 双指针:时间复杂度O(n)
slow = 0
fast = 0
while(fast < len(nums)):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
else:
fast += 1
return slow # slow+=1了,所以不用再+1