diff --git a/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md b/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md index 3f9cd747..dfd90b82 100644 --- a/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md +++ b/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md @@ -390,52 +390,49 @@ class Solution: ```go func searchRange(nums []int, target int) []int { - leftBorder := searchLeftBorder(nums, target) - rightBorder := searchRightBorder(nums, target) - - if leftBorder == -2 || rightBorder == -2 { // 情况一 - return []int{-1, -1} - } else if rightBorder-leftBorder > 1 { // 情况三 - return []int{leftBorder + 1, rightBorder - 1} - } else { // 情况二 - return []int{-1, -1} - } + leftBorder := getLeft(nums, target) + rightBorder := getRight(nums, target) + // 情况一 + if leftBorder == -2 || rightBorder == -2 { + return []int{-1, -1} + } + // 情况三 + if rightBorder - leftBorder > 1 { + return []int{leftBorder + 1, rightBorder - 1} + } + // 情况二 + return []int{-1, -1} } -func searchLeftBorder(nums []int, target int) int { - left, right := 0, len(nums)-1 - leftBorder := -2 // 记录一下leftBorder没有被赋值的情况 - for left <= right { - middle := (left + right) / 2 - if target == nums[middle] { - right = middle - 1 - // 左边界leftBorder更新 - leftBorder = right - } else if target > nums[middle] { - left = middle + 1 - } else { - right = middle - 1 - } +func getLeft(nums []int, target int) int { + left, right := 0, len(nums)-1 + border := -2 // 记录border没有被赋值的情况;这里不能赋值-1,target = num[0]时,会无法区分情况一和情况二 + for left <= right { // []闭区间 + mid := left + ((right - left) >> 1) + if nums[mid] >= target { // 找到第一个等于target的位置 + right = mid - 1 + border = right + } else { + left = mid + 1 } - return leftBorder + } + return border } -func searchRightBorder(nums []int, target int) int { - left, right := 0, len(nums)-1 - rightBorder := -2 // 记录一下rightBorder没有被赋值的情况 - for left <= right { - middle := (left + right) / 2 - if target == nums[middle] { - left = middle + 1 - // 右边界rightBorder更新 - rightBorder = left - } else if target > nums[middle] { - left = middle + 1 - } else { - right = middle - 1 - } +func getRight(nums []int, target int) int { + left, right := 0, len(nums) - 1 + border := -2 + for left <= right { + mid := left + ((right - left) >> 1) + if nums[mid] > target { + right = mid - 1 + } else { // 找到第一个大于target的位置 + left = mid + 1 + border = left } - return rightBorder + } + return border + } ``` diff --git a/problems/0283.移动零.md b/problems/0283.移动零.md index 13b9c26c..bb75a696 100644 --- a/problems/0283.移动零.md +++ b/problems/0283.移动零.md @@ -89,9 +89,33 @@ Python: for i in range(slow, len(nums)): nums[i] = 0 ``` +交换前后变量,避免补零 +```python + def moveZeroes(self, nums: List[int]) -> None: + slow, fast = 0, 0 + while fast < len(nums): + if nums[fast] != 0: + nums[slow], nums[fast] = nums[fast], nums[slow] + slow += 1 # 保持[0, slow)区间是没有0的 + fast += 1 +``` Go: +```go +func moveZeroes(nums []int) { + slow := 0 + for fast := 0; fast < len(nums); fast ++ { + if nums[fast] != 0 { + temp := nums[slow] + nums[slow] = nums[fast] + nums[fast] = temp + slow++ + } + } +} +``` + JavaScript: ```javascript var moveZeroes = function(nums) {