// 二分查找,返回的是数组的索引 func search(nums []int) int { // 边界条件 if len(nums) < 2 { return0 } // 左右下标 l := 0 r := len(nums) - 1 for l <= r { mid := (l + r) / 2 // 最后左右相等的时候就是转折 if l == r { return l } // 如果左边小于中间值,左半部分递增,则转折点在右边,否在在左边 if nums[r] < nums[mid] { l = mid + 1 } else { r = mid } } return0 }
// 暴力法 func search(nums []int) int { // 边界条件 if len(nums) < 2 { return0 } for i, v := range nums { // 出现转折,说明下一个值小于前一个值了 if v > nums[i+1] { return i } } return0 }
// 二分查找 func isPerfectSquare(num int) bool { // 边界条件 if num < 2 { returntrue } l := 0 // 平方根一定在一半之前,后面的平方肯定大于num r := num / 2 for l <= r { mid := (l + r) / 2 // 找到结果返回 if mid * mid == num { returntrue } if mid * mid > num { r = mid - 1 } else {l = mid + 1} } returnfalse }
奇数方法 完全平方数都是由奇数组成的,每次减去奇数,最后是0则是完全平方数
1 2 3 4 5 6 7 8
func isPerfectSquare(num int) bool { n := 1 for num > 0 { num -= n n += 2 } return num == 0 }
牛顿迭代
以当前点的切线斜率公式推导 x^2 - num = 0
当前点的切线交于x轴为y点
f(x)/(x - y) = f`(x)
(x^2 - num)/(x-y) = 2x
x^2 - num = 2x^2-2xy
y=(x+num/x)/2
1 2 3 4 5 6 7 8 9 10 11 12
func isPerfectSquare(num int) bool { if num < 2 { returntrue } // 从一半开始 x := num / 2 // 不断迭代,找其切线斜率的坐标,直到,满足表达式x^2 - num = 0 for x * x > num { x = (x + num / x) / 2 } return x * x == num }