leetcode704.
二分法:在一个数组里找到一个target,判断其在不在数组里,如果在,返回该target所在的数组元素的下标,若没找到返回-1
#左闭右闭
class Solution: ## 定义了一个名为solution类(即描述一个对象的规则)
def search(self, nums: List[int], target: int) -> int:
# 该代码要实现一个名为search的方法,这个方法接受两个参数,nums和target,并返回一个整数值(->)
# nums 是一个整数列表(List[int] 是 Python 的类型提示语法,表示列表中应包含整数)。
# target 是一个整数,我们在这个方法中尝试在 nums 列表中查找它。
left,right = 0,len(nums) - 1
# 这行代码是在定义两个变量,分别为left和right;这两个变量被分别初始化为0和len(nums) - 1。
# 这里的len(nums) - 1是在计算列表nums的长度(即其中的元素数量),然后减去1,以获取列表的最后一个元素的索引。因为在Python中,列表的索引是从0开始的,所以最后一个元素的索引会是总长度减1。
# 这行代码的含义是:初始化左边界为0,右边界为列表最后一个元素的索引。在二分查找等算法中,我们常常会使用这样的策略来设定查找的范围。
where left <= right:
middle = (left+right)//2
# 先初始化左右边界(left 和 right),然后通过不断地将搜索范围一分为二来查找目标元素。
# where left <= right是一个循环条件,它确保了只要左边界不大于右边界,循环就会继续执行。一旦左边界大于右边界,就意味着搜索范围已经缩小到了无法再缩小,此时可以返回 -1 表示没有找到目标元素。
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle - 1
else:
return middle
return -1
# 左闭右开
class Solution:
def search(self, nums: List[int], target: int) -> int:
left,right =0, len(nums)
while left < right:
mid = (left + right) // 2
if nums[mid] < target:
left = mid+1
elif nums[mid] > target:
right = mid
else:
return mid
return -1
leetcode 27.
# 双指针法
class Solution:
# 定义一个名为solution的类
def removeElement(self, nums: List[int], val: int) -> int:
# 在solution类中定义一个名为removeelement
# 这个函数的目标是从一个整数列表nums中移除所有等于val的元素,并返回移除后的列表长度。
fast = 0 # 快指针
slow = 0 # 慢指针
# 分别定义两个指针,初始值都为0。fast用于遍历列表,slow用于收集不等于val的元素。
size = len(nums)
# 获取nums列表的长度,并将其存储在变量size中。
while fast < size:
# 使用while循环遍历列表。循环条件是fast小于size
if nums[fast]!= val:
# 在循环内,检查当前fast指向的元素是否等于val。如果不等于,执行下一行代码。
nums[slow] = nums[fast]
# 将当前fast指向的元素复制到slow的位置。
slow += 1
# 将slow指针向前移动一位,以收集下一个不等于val的元素。
fast += 1
# 将fast指针向前移动一位,以继续检查下一个元素。
return slow
# 返回移除后的列表长度
# 暴力解题法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i, l = 0, len(nums)
while i < l:
if nums[i] == val: # 找到等于目标值的节点
for j in range(i+1, l): # 移除该元素,并将后面元素向前平移
nums[j - 1] = nums[j]
l -= 1
i -= 1
i += 1
return l