Go 每周一刷1.1

简介: Go 每周一刷1.1

1668493344327.jpg

一个数的平方如果大于目标数,那么这个数一定不是目标数的平方根。这里,我们可以把二分的下界设置成0,上界粗略设置成目标值。每次只需要比较中位数 mid 的平方和 x 的关系即可。代码很好懂,

func mySqrt(x int) int {
  left, right := 0, x
  res := -1 
  for left <= right {
    mid := left + ((right - left) >> 1)
    if mid*mid <= x {
      res = mid
      left = mid + 1
    } else {
      right = mid - 1
    }
  }
  return res
}

1668493384143.jpg

一看题目,这也能二分来解?

在我们的认知中,二分查找针对的对象是一个有序的集合,但是我们这个 demo 集合并不是有序的。为什么选这道题,是因为想带你们从不一样的角度看待二分。

我们在看待二分的时候往往会陷入到给定集合数据,或者陷入到二分就是利用集合的索引下标进行划分,我称之为确定二分的对象。

可是,根据上面的题意我们也可以确定二分的对象。

给定集合的整形范围在 1-n 之间,这不就是我们可以拆分的对象吗?

说人话!

定集合的整形范围在 1-n 之间,可集合总数是 n+1,必然存在重复的数。那么我们只要每次取 n 的中位数,遍历集合,统计不大于中位数的个数,如果个数大于中位数,那就说明重复数肯定存在于中位数的左区间(包括n),否则的话重复数必然出现在右区间。因此,当你能确定要对【什么】进行二分的时候,题目已经解了一半了。具体看代码,


func findDuplicate(nums []int) int {
  left, right := 0, len(nums)-1
  res := -1 //结果
  for left <= right {
    mid := left + ((right - left) >> 1)
    amount := 0
    for j := 0; j < len(nums); j++ {
      if nums[j] <= mid { //统计不大于当前中位数的个数
        amount++
      }
    }
    if amount <= mid { // 如果统计个数不大于中位数,说明重复的值在右区间
      left = mid + 1
    } else { //否则重复值在左区间,并且包括中位数
      res = mid
      right = mid - 1
    }
  }
  //返回结果
  return res
}


我们可以看看这个算法的复杂度。首先二分本身的时间复杂度是 O(logN)。在二分的内部,有一个 for 语句,复杂度是 O(N),故最终时间复杂度是O(NlogN)。空间复杂度O(1)。道题有比二分更好的解法,至于其他更好的解法,可以自行研究。

相关文章
Go每周一刷第四周
Go每周一刷第四周
80 0
Go每周一刷第四周
Go 每周一刷之二分结尾
Go 每周一刷之二分结尾
92 0
Go 每周一刷之二分结尾
|
4天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
|
3天前
|
Ubuntu 编译器 Linux
go语言中SQLite3驱动安装
【11月更文挑战第2天】
19 7
|
3天前
|
关系型数据库 Go 网络安全
go语言中PostgreSQL驱动安装
【11月更文挑战第2天】
20 5
|
3天前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
12 1
|
2天前
|
程序员 Go
go语言中的控制结构
【11月更文挑战第3天】
75 58
|
1天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
2天前
|
存储 编译器 Go
go语言中的变量、常量、数据类型
【11月更文挑战第3天】
15 9
|
2天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
17 7