704.二分查找
二分法条件:
- 整型数组有序且无重复元素
- 找到循环不变量且目标值在循环不变量中
解法一(左闭右闭):
def search(self, nums: List[int], target: int) -> int:
l, r = 0, len(nums)-1
while(l<=r):
m = (l+r)//2
if nums[m] == target:
return m
elif nums[m] < target:
l = m+1
else:
r = m-1
return -1
解法二(左闭右开):
def search(self, nums: List[int], target: int) -> int:
l, r = 0, len(nums)
while(l<r):
m = l+(r-l)//2
if nums[m] > target:
# (这里和左闭右闭是有区别的,不能用r= m+1,这里我们只指导nums[m]<target,
# 不知道nums[m+1]是否还小于!!)
r = m
elif nums[m] < target:
l = m+1
else:
r = m
return -1
27.移除元素
使用快慢指针解决:快指针遍历所有元素;慢指针遍历不等于val的元素
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
j = 0
for i in range(len(nums)):
if nums[i] != val:
nums[j] = nums[i]
j += 1
return j
977.有序数组的平方
思路:数组有序,那么两端的数字绝对值比较大,将逐个比较两端数字的平方,将大的那个添加到新的数组中,最后反转一下这个数组,就是将原数组平方后从小到大排列
def sortedSquares(self, nums):
l, r = 0, len(nums)-1
x = []
while(l<=r):
a = nums[l]*nums[l]
b = nums[r]*nums[r]
if a>b:
x.append(a)
l+=1
else:
r-=1
x.append(b)
return x[::-1]