Skip to content

Commit 0b8bd71

Browse files
Merge pull request youngyangyang04#1009 from leeeeeeewii/master
添加 34. 在排序数组中查找元素的第一个和最后一个位置 Go版本; 添加0283.移动零 python不同方法,Go版本
2 parents 6ea6956 + e15aa3d commit 0b8bd71

File tree

2 files changed

+61
-40
lines changed

2 files changed

+61
-40
lines changed

problems/0034.在排序数组中查找元素的第一个和最后一个位置.md

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -390,52 +390,49 @@ class Solution:
390390

391391
```go
392392
func searchRange(nums []int, target int) []int {
393-
leftBorder := searchLeftBorder(nums, target)
394-
rightBorder := searchRightBorder(nums, target)
395-
396-
if leftBorder == -2 || rightBorder == -2 { // 情况一
397-
return []int{-1, -1}
398-
} else if rightBorder-leftBorder > 1 { // 情况三
399-
return []int{leftBorder + 1, rightBorder - 1}
400-
} else { // 情况二
401-
return []int{-1, -1}
402-
}
393+
leftBorder := getLeft(nums, target)
394+
rightBorder := getRight(nums, target)
395+
// 情况一
396+
if leftBorder == -2 || rightBorder == -2 {
397+
return []int{-1, -1}
398+
}
399+
// 情况三
400+
if rightBorder - leftBorder > 1 {
401+
return []int{leftBorder + 1, rightBorder - 1}
402+
}
403+
// 情况二
404+
return []int{-1, -1}
403405
}
404406

405-
func searchLeftBorder(nums []int, target int) int {
406-
left, right := 0, len(nums)-1
407-
leftBorder := -2 // 记录一下leftBorder没有被赋值的情况
408-
for left <= right {
409-
middle := (left + right) / 2
410-
if target == nums[middle] {
411-
right = middle - 1
412-
// 左边界leftBorder更新
413-
leftBorder = right
414-
} else if target > nums[middle] {
415-
left = middle + 1
416-
} else {
417-
right = middle - 1
418-
}
407+
func getLeft(nums []int, target int) int {
408+
left, right := 0, len(nums)-1
409+
border := -2 // 记录border没有被赋值的情况;这里不能赋值-1,target = num[0]时,会无法区分情况一和情况二
410+
for left <= right { // []闭区间
411+
mid := left + ((right - left) >> 1)
412+
if nums[mid] >= target { // 找到第一个等于target的位置
413+
right = mid - 1
414+
border = right
415+
} else {
416+
left = mid + 1
419417
}
420-
return leftBorder
418+
}
419+
return border
421420
}
422421

423-
func searchRightBorder(nums []int, target int) int {
424-
left, right := 0, len(nums)-1
425-
rightBorder := -2 // 记录一下rightBorder没有被赋值的情况
426-
for left <= right {
427-
middle := (left + right) / 2
428-
if target == nums[middle] {
429-
left = middle + 1
430-
// 右边界rightBorder更新
431-
rightBorder = left
432-
} else if target > nums[middle] {
433-
left = middle + 1
434-
} else {
435-
right = middle - 1
436-
}
422+
func getRight(nums []int, target int) int {
423+
left, right := 0, len(nums) - 1
424+
border := -2
425+
for left <= right {
426+
mid := left + ((right - left) >> 1)
427+
if nums[mid] > target {
428+
right = mid - 1
429+
} else { // 找到第一个大于target的位置
430+
left = mid + 1
431+
border = left
437432
}
438-
return rightBorder
433+
}
434+
return border
435+
439436
}
440437
```
441438

problems/0283.移动零.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,33 @@ Python:
8989
for i in range(slow, len(nums)):
9090
nums[i] = 0
9191
```
92+
交换前后变量,避免补零
93+
```python
94+
def moveZeroes(self, nums: List[int]) -> None:
95+
slow, fast = 0, 0
96+
while fast < len(nums):
97+
if nums[fast] != 0:
98+
nums[slow], nums[fast] = nums[fast], nums[slow]
99+
slow += 1 # 保持[0, slow)区间是没有0的
100+
fast += 1
101+
```
92102

93103
Go:
94104

105+
```go
106+
func moveZeroes(nums []int) {
107+
slow := 0
108+
for fast := 0; fast < len(nums); fast ++ {
109+
if nums[fast] != 0 {
110+
temp := nums[slow]
111+
nums[slow] = nums[fast]
112+
nums[fast] = temp
113+
slow++
114+
}
115+
}
116+
}
117+
```
118+
95119
JavaScript:
96120
```javascript
97121
var moveZeroes = function(nums) {

0 commit comments

Comments
 (0)