一、二分查找法
1、左闭右闭区间:[a,b]
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1 # 定义target在左闭右闭的区间里,[left, right]
while left <= right:
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle - 1 # target在左区间,所以[left, middle - 1]
elif nums[middle] < target:
left = middle + 1 # target在右区间,所以[middle + 1, right]
else:
return middle # 数组中找到目标值,直接返回下标
return -1 # 未找到目标值
2、左闭右开区间:[a,b)
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) # 定义target在左闭右开的区间里,即:[left, right)
while left < right: # 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle # target 在左区间,在[left, middle)中
elif nums[middle] < target:
left = middle + 1 # target 在右区间,在[middle + 1, right)中
else:
return middle # 数组中找到目标值,直接返回下标
return -1 # 未找到目标值
3、题目链接https://leetcode.cn/problems/binary-search/
4 、重点:要关注区间类型以及更新条件,什么时候相等
二、移除数组
1、数组不能删除,只能覆盖
2、暴力解法,通过两个for循环来完成。时间复杂度为O(n^2)
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i=0
l=len(nums)
while i<l:
if nums[i]==val:
j=i
for j in range(j+1,l):
nums[j-1]=nums[j]
l-=1
i-=1
i+=1
return l
3、双指针法
极为重要,后面还需勤加练习,通过快慢指针来实现for循环
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
slow=0
fast=0
size=len(nums)
while fast<size:
if val!=nums[fast]:
nums[slow]=nums[fast]
slow+=1
fast+=1
return slow
1、平方后,最大的数应该在两边
2、
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
l, r, i = 0, len(nums)-1, len(nums)-1
res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果
while l <= r:
if nums[l] ** 2 < nums[r] ** 2: # 左右边界进行对比,找出最大值
res[i] = nums[r] ** 2
r -= 1 # 右指针往左移动
else:
res[i] = nums[l] ** 2
l += 1 # 左指针往右移动
i -= 1 # 存放结果的指针需要往前平移一位
return res