Merge pull request #1009 from leeeeeeewii/master

添加 34. 在排序数组中查找元素的第一个和最后一个位置 Go版本; 添加0283.移动零 python不同方法,Go版本
This commit is contained in:
程序员Carl
2022-01-19 20:01:39 +08:00
committed by GitHub
2 changed files with 61 additions and 40 deletions

View File

@ -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没有被赋值的情况;这里不能赋值-1target = 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
}
```

View File

@ -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) {