【LeetCode】二叉树相关算法题
目录
- 1、二叉树使用前提
- 2、算法题
- 【1】搜索插入位置
- 【2】在排序数组中查找元素的第一个和最后一个位置
- 【3】x 的平方根
- 【4】有效的完全平方数
1、二叉树使用前提
使用二叉树要满足以下两个条件:
1、有序数组
2、无重复值
2、算法题
【1】搜索插入位置
LeetCode第35题,题目如下:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被顺序插入的位置。
请必须使用时间复杂度为O(log n)的算法。
示例1:
输入:nums = [1, 3, 5, 6], target = 5
输出:2
示例2:
输入:nums = [1, 3, 5, 6], target = 2
输出:1
示例3:
输入:nums = [1, 3, 5, 6], target = 7
输出:4
代码示例:
func searchInsert(nums []int, target int) int {left, right := 0, len(nums)-1var index intfor left <= right {mid := left + (right-left)/2if target == nums[mid] {return mid} else if target < nums[mid] { //目标值在左区间right = mid - 1index = mid} else { //目标值在右区间left = mid + 1index = mid + 1}}return index
}
【2】在排序数组中查找元素的第一个和最后一个位置
LeetCode第34题,题目如下:
给一个按照非递减顺序排列的整数数组nums,和一个目标值target。请找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值target,返回[-1, -1]。
设计并实现时间复杂度为O(log n)的算法来解决问题。
示例1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3, 4]
示例2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1, -1]
示例3:
输入: nums = [], target = 0
输出: [-1, -1]
代码示例:
func searchRange(nums []int, target int) []int {leftBorder, rightBorder := -2, -2 //左边界和右边界, 不能使用-1, 因为当目标值等于数组最左边值时,此时leftBorder=-1left, right := 0, len(nums)-1 //二分法查找的左右索引//先找右边界for left <= right {mid := left + (right-left)/2if target < nums[mid] { //目标值在左区间right = mid - 1} else {left = mid + 1rightBorder = left}}//再找左边界left, right = 0, len(nums)-1for left <= right {mid := left + (right-left)/2if target > nums[mid] { //目标值在右区间left = mid + 1} else {right = mid - 1leftBorder = right}}//判断三种情况if leftBorder == -2 || rightBorder == -2 { //目标值在最左边之外rightBorder=-2或者目标值在最右边之外leftBorder=-2return []int{-1, -1}} else if (rightBorder - leftBorder) > 1 { //目标值至少存在一个return []int{leftBorder + 1, rightBorder - 1}} else { //目标值的大小在数组范围内,但是没有相等的return []int{-1, -1}}
}
【3】x 的平方根
LeetCode第69题,题目如下:
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 231 - 1
代码示例:
func mySqrt(x int) int {left, right := 0, xvar index intfor left <= right {mid := left + (right-left)/2if mid*mid == x {return mid} else if mid*mid < x { //平方根在右区间left = mid + 1index = mid} else { //平方根在左区间right = mid - 1index = right}}return index
}
【4】有效的完全平方数
LeetCode第367题,题目如下:
给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
示例 2:
输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。
提示:
1 <= num <= 231 - 1
代码示例如下:
func isPerfectSquare(num int) bool {left, right := 1, numfor left <= right {mid := left + (right-left)/2if mid*mid == num {return true} else if mid*mid > num { //目标值在左区间right = mid - 1} else { //目标值在右区间left = mid + 1}}return false
}