1. 二分查找法
- 重点关注代码中标注的易错的四个要点地方
- 两种解法的区别在于 边界条件,即区间的开闭 ,需要理解
解法 1 :在左闭右闭区间求解
def binarysearch(a, num):
length = len(a)
low = 0
high = length - 1 # 注意此时减一
while low <= high: # 注意等于号
mid = int(low + ((high - low) / 2)) ##使用(low+high)/2会有整数溢出的问题
if a[mid] < num:
low = mid + 1 #注意区间缩小
elif a[mid] > num:
high = mid - 1 #注意区间缩小
else:
return mid
return -1
解法 2 :在左开右闭区间上求解
def binarysearch(a, num):
length = len(a)
low = 0
high = length # 变了
while low < high: # 变了
mid = int(low + ((high - low) / 2))
if a[mid] < num:
low = mid + 1
elif a[mid] > num:
high = mid # 变了
else:
return mid
return -1
2. move zeros(移动零元素至末尾问题 283)
-
r 向前探索,依次找到所有的非零元素,借助 L 移动到整个数组的最前面,最后再将(L,R)全部置零
- 遇到非零 :arr[L] = arr[R],:L++,R++
- 遇到 0 :r++
# 解法 1
def moveZeroes(self, nums: List[int]) -> None:
l = 0
for r in range(len(nums)):
if nums[r] != 0:
nums[l] = nums[r]
l += 1
r += 1
else:
r += 1
for i in range(l,r):
nums[i] = 0
# 解法 2
def moveZeroes(self, nums):
zero = 0 # records the position of "0"
for i in xrange(len(nums)):
if nums[i] != 0:
nums[i], nums[zero] = nums[zero], nums[i]
zero += 1
3.删除排序数组中的重复项 (26)
- i 守住数组的前面该放元素的位置,j 向前探索,遇到前面没有的 --> 拉回交换,否则,不断探索,直到找完所有该放的元素。
size = len(nums)
i = 0
for j in range( size ):
if nums[j] != nums[i]:
nums[i+1] = nums[j]
i += 1
j += 1
else:
j += 1
return i+1
4.删除排序数组中的重复项 II (80)
- 因为是排序的,所以如果 nums[i] == nums[i-k] 说明 k 个不重复元素已经够了。直到不等于时说明出现了需要移动的元素,移动到i位置,i++ 即可 (为了防止数组元素长度不足导致数组越界,加上判断语句 i<2 时不操作语句)
# 1.此题解法
def removeDuplicates(self, nums: List[int]) -> int:
i = 0
for n in nums:
if i < 2 or n != nums[i-2]:
nums[i] = n
i += 1
return i
# 2.通用解法
class Solution:
def removeDuplicates(self, nums, k):
i = 0
for n in num]s:
if i < k or n != nums[i-k]:
nums[i] = n
i += 1
return i