Go 每周一刷之二分结尾

简介: Go 每周一刷之二分结尾

1668494526526.jpg

本身数组是个有序数组,只是在某个点上发生旋转,我们可以取中位数进行拆分数组,拆分后的数组有一部分一定是有序的,那么我们只要找到有序的那一部分,根据已经给定 target 值进行判断,可以逐步缩小空间。

func Search(nums []int, target int) int {
  if len(nums) == 0 {
    return -1
  }
  left, right := 0, len(nums)-1
  for left <= right {
    mid := left + ((right - left) >> 1)
    midValue := nums[mid]
    if midValue == target {
      return mid
    }
    // 说明此数组从中位数到右半区是有序的
    if midValue < nums[right] {
      // 说明目标值在(mid,right]之间
      if midValue < target && target <= nums[right] {
        left = mid + 1
        // 否则就在[left,mid-1]
      } else {
        right = mid - 1
      }
    } else {
      if midValue > target && target >= nums[left] {
        right = mid - 1
      } else {
        left = mid + 1
      }
    }
  }
  return -1
}

1668494560891.jpg

这道题题型和上一题是一样的,只是最终求的是数组中最小值。思路还是去确定最小值在哪个区间。

func findMin(nums []int) int {
  left, right := 0, len(nums)-1
  // 这道题提示不会有重复值,这种情况说明并未旋转
  if nums[left] < nums[right] {
    return nums[left]
  }
  for left < right {
    mid := left + ((right - left) >> 1)
    // 中位数可能是最小值
    if nums[mid] < nums[right] {
      right = mid
      // 中位数肯定不是最小值
    } else {
      left = mid + 1
    }
  }
  return nums[left]
}

二分查找并没有唯一的写法。主要看你站在什么样的角度思考,在我看来主要还是边界划分的问题,这是一个核心点以及难点,这个搞清楚,二分也就解了一半。

最后放出一道结尾题目,也是我非常喜欢的一道题,好像也是一道大厂面试高频题?感兴趣的刷去吧。

1668494594693.jpg

相关文章
Go每周一刷第四周
Go每周一刷第四周
86 0
Go每周一刷第四周
|
算法 Go 索引
Go 每周一刷1.1
Go 每周一刷1.1
97 0
Go 每周一刷1.1
|
17天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
27 7
|
17天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
17天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
92 71
|
16天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
100 67
|
19天前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
89 62
|
21天前
|
并行计算 安全 Go
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念——goroutine和channel。不同于传统的线程模型,Go通过轻量级的goroutine和通信机制channel,实现了高效的并发处理。我们将从基础概念开始,逐步深入到实际应用案例,揭示如何在Go语言中优雅地实现并发控制和数据同步。 ####
|
17天前
|
存储 Go
go语言中映射
go语言中映射
32 11
|
19天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
29 12