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每周一刷第四周
185 0
Go每周一刷第四周
Go 每周一刷之二分结尾
Go 每周一刷之二分结尾
144 0
Go 每周一刷之二分结尾
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
146 1
|
3月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
284 1
|
9月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
9月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
3月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
359 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
232 0
|
3月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
212 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
304 0

热门文章

最新文章

下一篇
oss云网关配置