二分查找的知识点:
左右坐标相加取得中位的索引所致。即middle = (left+right)/ 2
解题思路:
定义 target 是在一个在左闭右闭的区间里,也就是[left, right] (这个很重要非常重要)。
区间的定义这就决定了二分法的代码应该如何写
因为定义target在[left, right]区间,所以有如下两点:
- while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
middle = (left+right)//2
if nums[middle] == target:
return middle
elif nums[middle] > target:
right = middle - 1
else:
left = middle + 1
return -1
解决方法: 使用pop函数进行求解
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
j=len(nums)
for i in range(j-1,-1,-1):
if nums[i]==val:
nums.pop(i)
return len(nums)
题目3:977. 有序数组的平方 - 力扣(LeetCode)
解决方法:有两种。第一种是使用sorted函数;第二种是使用双指针法进行解决
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
# 一行代码搞定
return sorted([i**2 for i in nums])
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
# 使用双指针法进行解决
i , j , pos = 0, len(nums)-1, len(nums)-1
result = [0]*len(nums)
while i <= j:
if nums[i]*nums[i] < nums[j]*nums[j]:
result[pos] = nums[j]*nums[j]
j -= 1
else:
result[pos] = nums[i]*nums[i]
i += 1
pos -= 1
return result