mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 03:34:02 +08:00
Merge pull request #1009 from leeeeeeewii/master
添加 34. 在排序数组中查找元素的第一个和最后一个位置 Go版本; 添加0283.移动零 python不同方法,Go版本
This commit is contained in:
@ -390,52 +390,49 @@ class Solution:
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
func searchRange(nums []int, target int) []int {
|
func searchRange(nums []int, target int) []int {
|
||||||
leftBorder := searchLeftBorder(nums, target)
|
leftBorder := getLeft(nums, target)
|
||||||
rightBorder := searchRightBorder(nums, target)
|
rightBorder := getRight(nums, target)
|
||||||
|
// 情况一
|
||||||
if leftBorder == -2 || rightBorder == -2 { // 情况一
|
if leftBorder == -2 || rightBorder == -2 {
|
||||||
return []int{-1, -1}
|
return []int{-1, -1}
|
||||||
} else if rightBorder-leftBorder > 1 { // 情况三
|
}
|
||||||
return []int{leftBorder + 1, rightBorder - 1}
|
// 情况三
|
||||||
} else { // 情况二
|
if rightBorder - leftBorder > 1 {
|
||||||
return []int{-1, -1}
|
return []int{leftBorder + 1, rightBorder - 1}
|
||||||
}
|
}
|
||||||
|
// 情况二
|
||||||
|
return []int{-1, -1}
|
||||||
}
|
}
|
||||||
|
|
||||||
func searchLeftBorder(nums []int, target int) int {
|
func getLeft(nums []int, target int) int {
|
||||||
left, right := 0, len(nums)-1
|
left, right := 0, len(nums)-1
|
||||||
leftBorder := -2 // 记录一下leftBorder没有被赋值的情况
|
border := -2 // 记录border没有被赋值的情况;这里不能赋值-1,target = num[0]时,会无法区分情况一和情况二
|
||||||
for left <= right {
|
for left <= right { // []闭区间
|
||||||
middle := (left + right) / 2
|
mid := left + ((right - left) >> 1)
|
||||||
if target == nums[middle] {
|
if nums[mid] >= target { // 找到第一个等于target的位置
|
||||||
right = middle - 1
|
right = mid - 1
|
||||||
// 左边界leftBorder更新
|
border = right
|
||||||
leftBorder = right
|
} else {
|
||||||
} else if target > nums[middle] {
|
left = mid + 1
|
||||||
left = middle + 1
|
|
||||||
} else {
|
|
||||||
right = middle - 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return leftBorder
|
}
|
||||||
|
return border
|
||||||
}
|
}
|
||||||
|
|
||||||
func searchRightBorder(nums []int, target int) int {
|
func getRight(nums []int, target int) int {
|
||||||
left, right := 0, len(nums)-1
|
left, right := 0, len(nums) - 1
|
||||||
rightBorder := -2 // 记录一下rightBorder没有被赋值的情况
|
border := -2
|
||||||
for left <= right {
|
for left <= right {
|
||||||
middle := (left + right) / 2
|
mid := left + ((right - left) >> 1)
|
||||||
if target == nums[middle] {
|
if nums[mid] > target {
|
||||||
left = middle + 1
|
right = mid - 1
|
||||||
// 右边界rightBorder更新
|
} else { // 找到第一个大于target的位置
|
||||||
rightBorder = left
|
left = mid + 1
|
||||||
} else if target > nums[middle] {
|
border = left
|
||||||
left = middle + 1
|
|
||||||
} else {
|
|
||||||
right = middle - 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return rightBorder
|
}
|
||||||
|
return border
|
||||||
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -89,9 +89,33 @@ Python:
|
|||||||
for i in range(slow, len(nums)):
|
for i in range(slow, len(nums)):
|
||||||
nums[i] = 0
|
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:
|
||||||
|
|
||||||
|
```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:
|
||||||
```javascript
|
```javascript
|
||||||
var moveZeroes = function(nums) {
|
var moveZeroes = function(nums) {
|
||||||
|
Reference in New Issue
Block a user