赞
踩

arr[mid-1] < arr[mid] && arr[mid] > arr[mid+1] arr[mid-1] < arr[mid] && arr[mid] < arr[mid+1]时:left = mid+1arr[mid-1] > arr[mid] && arr[mid] > arr[mid+1]时:right = mid-1func peakIndexInMountainArray(arr []int) int { length := len(arr) if length < 3 { return -1 } left, right := 1, length-2 //不可能是首位元素,可以直接排除 for left <= right { mid := (right-left)>>1 + left if arr[mid-1] < arr[mid] && arr[mid] > arr[mid+1] { return mid } else if arr[mid-1] < arr[mid] && arr[mid] < arr[mid+1] { //上坡 left = mid+1 } else { //下坡 right = mid-1 } } return -1 }
题目链接:LeetCode-153. 寻找旋转排序数组中的最小值


arr[mid]>arr[right]即最小值的左边时:left = mid+1 (这里为什么+1,因为arr[mid]都大于别的数了,说明肯定不可能是它,所以可以跳过它)arr[mid]<arr[right]即最小值的右边时:right=mid(这里为什么不+1,因为这里只能看出arr[mid]小于另一个数,但不知道它是不是最小的,有这个可能,所以需要再和别的进行对比)return arr[right](根据实际举例画图可知)func findMin(nums []int) int {
length := len(nums)
left, right := 0, length-1
for left<right {
mid := (right-left)>>1 + left
if nums[mid] > nums[right] { //最小值左边
left = mid+1
} else { //最小值右边
right = mid
}
}
return nums[right]
}
题目链接:LeetCode-剑指 Offer 53 - II. 0~n-1中缺失的数字

arr[i] != i 时的 iarr[i]==i时:left=mid+1arr[i]!=i时:right=mid-1,每次更新right之前,用一个变量find接收mid的值,当跳出循环时,该变量就是目标值。return findfunc missingNumber(nums []int) int {
length := len(nums)
left, right := 0, length-1
find := length
for left <= right {
mid := (right-left)>>1 + left
if nums[mid] == mid {
left = mid+1
} else {
find = mid
right = mid-1
}
}
return find
}
x/mid == midx/mid > mid:代表除少了(比如 8/2 > 2),left=mid+1x/mid < mid:代表除多了(比如 8/4 < 4),right=mid-1return right(根据实际举例画图可知)func mySqrt(x int) int {
left, right := 1, x
for left <= right {
mid := (right-left)>>1 + left
if x/mid == mid {
return mid
} else if x/mid < mid { //除多了
right = mid-1
} else { //除少了
left = mid+1
}
}
return right
}
root.Val == valroot.Val < val时:在root的Right部分寻找root.Val > val时:在root的Left部分寻找/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func searchBST(root *TreeNode, val int) *TreeNode { for root != nil && root.Val != val { if root.Val > val { root = root.Left } else { root = root.Right } } return root }
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func isValidBST(root *TreeNode) bool { isFirst := true var min int //用于缓存当前最小值 var a func(*TreeNode) bool a = func(root *TreeNode) bool { if root == nil { return true } if !a(root.Left) { return false } // 最左叶子树时:直接跳过比值判断 if isFirst { isFirst = false } else if root.Val <= min { return false } min = root.Val return a(root.Right) } return a(root) }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。