二分查找 添加Go语言代码
parent
fb44fd69a6
commit
d9e076483c
|
@ -76,4 +76,35 @@ class Solution {
|
|||
}
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func search(nums []int, target int) bool {
|
||||
l, r := 0, len(nums) - 1
|
||||
for l <= r {
|
||||
m := l + (r - l) / 2
|
||||
if nums[m] == target {
|
||||
return true
|
||||
}
|
||||
// 先判断哪边是递增的,再查找范围
|
||||
if nums[m] == nums[l] {
|
||||
l++
|
||||
} else if nums[l] < nums[m] {
|
||||
// 判断target是否在有序的那边就行了。
|
||||
if nums[l] <= target && target < nums[m] {
|
||||
r = m - 1
|
||||
} else {
|
||||
l = m + 1
|
||||
}
|
||||
} else if nums[l] > nums[m] {
|
||||
if nums[m] < target && target <= nums[r] {
|
||||
l = m + 1
|
||||
} else {
|
||||
r = m - 1
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
@ -111,3 +111,23 @@ public:
|
|||
};
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func findMin(nums []int) int {
|
||||
l, r := 0, len(nums) - 1
|
||||
for l < r {
|
||||
if nums[l] < nums[r] {
|
||||
return nums[l]
|
||||
}
|
||||
m := l + (r - l) / 2
|
||||
if nums[l] > nums[m] {
|
||||
r = m
|
||||
} else {
|
||||
l = m + 1
|
||||
}
|
||||
}
|
||||
return nums[l]
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
@ -130,4 +130,34 @@ class Solution {
|
|||
}
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func search(nums []int, target int) int {
|
||||
l, r := 0, len(nums) - 1
|
||||
for l <= r {
|
||||
m := (l + r) / 2
|
||||
if target == nums[m] {
|
||||
return m
|
||||
}
|
||||
// 先判断哪边是有序的
|
||||
if nums[m] < nums[r] {
|
||||
// 再判断target在左右哪边
|
||||
if target > nums[m] && target <= nums[r] {
|
||||
l = m + 1
|
||||
} else {
|
||||
r = m - 1
|
||||
}
|
||||
} else {
|
||||
if target < nums[m] && target >= nums[l] {
|
||||
r = m - 1
|
||||
} else {
|
||||
l = m + 1
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
```
|
||||
|
||||
##
|
|
@ -176,3 +176,45 @@ class Solution {
|
|||
}
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func searchRange(nums []int, target int) []int {
|
||||
upper := upperBound(nums, target)
|
||||
lower := lowerBound(nums, target)
|
||||
|
||||
if (upper < lower) {
|
||||
return []int{-1, -1}
|
||||
}
|
||||
return []int{lower, upper}
|
||||
}
|
||||
|
||||
// upperBound 计算上边界
|
||||
func upperBound(nums []int, target int) int {
|
||||
l, r := 0, len(nums) - 1
|
||||
for l <= r {
|
||||
m := l + (r - l) / 2
|
||||
if target >= nums[m] {
|
||||
l = m + 1
|
||||
} else if target < nums[m] {
|
||||
r = m - 1
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
// lowerBound 计算下边界
|
||||
func lowerBound(nums []int, target int) int {
|
||||
l, r := 0, len(nums) - 1
|
||||
for l <= r {
|
||||
m := l + (r - l) / 2
|
||||
if target <= nums[m] {
|
||||
r = m - 1
|
||||
} else if target > nums[m] {
|
||||
l = m + 1
|
||||
}
|
||||
}
|
||||
return l
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
> 如果阅读时,发现错误,或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
|
||||
> 如果阅读时,发现错误,或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
|
||||
>
|
||||
> 感谢支持,该仓库会一直维护,希望对各位有一丢丢帮助。
|
||||
>
|
||||
|
@ -66,5 +66,23 @@ class Solution {
|
|||
}
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func searchInsert(nums []int, target int) int {
|
||||
l, r := 0, len(nums) - 1
|
||||
for l <= r {
|
||||
m := l + (r - l) / 2
|
||||
if target == nums[m] {
|
||||
return m
|
||||
}
|
||||
if target < nums[m] {
|
||||
r = m - 1
|
||||
} else if target > nums[m] {
|
||||
l = m + 1
|
||||
}
|
||||
}
|
||||
return l
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
>
|
||||
> 另外希望手机阅读的同学可以来我的 <u>[**公众号:袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
|
||||
|
||||
#### [74. 搜索二维矩阵](https://leetcode-cn.com/problems/search-a-2d-matrix/)****
|
||||
#### **[74. 搜索二维矩阵](https://leetcode-cn.com/problems/search-a-2d-matrix/)**
|
||||
|
||||
下面我们来看一下另外一种变体,如何在二维矩阵里使用二分查找呢?
|
||||
|
||||
|
@ -84,3 +84,30 @@ class Solution {
|
|||
}
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func searchMatrix(matrix [][]int, target int) bool {
|
||||
if len(matrix) == 0 {
|
||||
return false
|
||||
}
|
||||
row, col := len(matrix), len(matrix[0])
|
||||
// 将二维数组拉平为一维。
|
||||
l, r := 0, row * col - 1
|
||||
for l <= r {
|
||||
m := l + (r - l) / 2
|
||||
// 将一维的坐标转换为二维
|
||||
x, y := m / col, m % col
|
||||
if matrix[x][y] == target {
|
||||
return true
|
||||
} else if matrix[x][y] < target {
|
||||
l = m + 1
|
||||
} else if matrix[x][y] > target {
|
||||
// 二分查找时,把所有的情况都要写出来,避免直接else
|
||||
r = m - 1
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
```
|
||||
|
||||
|
|
Loading…
Reference in New Issue