diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 37248e4819..6b4f20b740 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -397,38 +397,74 @@ class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: def getRightBorder(nums:List[int], target:int) -> int: left, right = 0, len(nums)-1 - rightBoder = -2 # 记录一下rightBorder没有被赋值的情况 + rightBorder = -2 # 记录一下rightBorder没有被赋值的情况 while left <= right: middle = left + (right-left) // 2 if nums[middle] > target: right = middle - 1 else: # 寻找右边界,nums[middle] == target的时候更新left left = middle + 1 - rightBoder = left + rightBorder = left - return rightBoder + return rightBorder def getLeftBorder(nums:List[int], target:int) -> int: left, right = 0, len(nums)-1 - leftBoder = -2 # 记录一下leftBorder没有被赋值的情况 + leftBorder = -2 # 记录一下leftBorder没有被赋值的情况 while left <= right: middle = left + (right-left) // 2 if nums[middle] >= target: # 寻找左边界,nums[middle] == target的时候更新right right = middle - 1 - leftBoder = right + leftBorder = right else: left = middle + 1 - return leftBoder - leftBoder = getLeftBorder(nums, target) - rightBoder = getRightBorder(nums, target) + return leftBorder + leftBorder = getLeftBorder(nums, target) + rightBorder = getRightBorder(nums, target) # 情况一 - if leftBoder == -2 or rightBoder == -2: return [-1, -1] + if leftBorder == -2 or rightBorder == -2: return [-1, -1] # 情况三 - if rightBoder -leftBoder >1: return [leftBoder + 1, rightBoder - 1] + if rightBorder -leftBorder >1: return [leftBorder + 1, rightBorder - 1] # 情况二 return [-1, -1] ``` ```python +# 解法1的代码简化,直接使用left和right值作为左右边界标记 +class Solution: + def searchRange(self, nums: List[int], target: int) -> List[int]: + # 查找左边界(第一个等于 target 的位置) + def getLeftBorder(nums: List[int], target: int) -> int: + left, right = 0, len(nums) - 1 + while left <= right: + middle = left + (right - left) // 2 + if nums[middle] >= target: # nums[middle] >= target 时,继续向左查找 + right = middle - 1 + else: + left = middle + 1 + return left + + # 查找右边界(最后一个等于 target 的位置) + def getRightBorder(nums: List[int], target: int) -> int: + left, right = 0, len(nums) - 1 + while left <= right: + middle = left + (right - left) // 2 + if nums[middle] > target: # nums[middle] > target 时,继续向右查找 + right = middle - 1 + else: + left = middle + 1 + return right + + # 查找左边界和右边界 + leftBorder = getLeftBorder(nums, target) + rightBorder = getRightBorder(nums, target) + + # 判断目标值是否存在 + if leftBorder <= rightBorder: + return [leftBorder, rightBorder] + else: + return [-1, -1] +``` +```python # 解法2 # 1、首先,在 nums 数组中二分查找 target; # 2、如果二分查找失败,则 binarySearch 返回 -1,表明 nums 中没有 target。此时,searchRange 直接返回 {-1, -1}; diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 5ecf89bf19..d54d54ed9f 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -367,9 +367,32 @@ class Solution { ``` ### Python: +用原来的链表操作: +```python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]: + while head != None and head.val == val: + head = head.next + cur = head + while cur != None and cur.next != None: + check = cur.next + if check.val == val: + cur.next = check.next + check = check.next + else: + cur = cur.next + check = check.next + return head + +``` ```python -(版本一)虚拟头节点法 +虚拟头节点法 # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None):