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每周一刷第四周
79 0
Go每周一刷第四周
|
算法 Go 索引
Go 每周一刷1.1
Go 每周一刷1.1
92 0
Go 每周一刷1.1
|
3天前
|
安全 网络协议 Go
Go语言网络编程
【10月更文挑战第28天】Go语言网络编程
89 65
|
3天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
24 13
|
3天前
|
网络协议 安全 Go
Go语言的网络编程基础
【10月更文挑战第28天】Go语言的网络编程基础
19 8
|
2天前
|
Go
go语言的复数常量
【10月更文挑战第21天】
13 6
|
2天前
|
Go
go语言的浮点型常量
【10月更文挑战第21天】
9 4
|
2天前
|
编译器 Go
go语言的整型常量
【10月更文挑战第21天】
8 3
|
3天前
|
Go
go语言编译时常量表达式
【10月更文挑战第20天】
11 3
|
2天前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。