【LeetCode】二叉树相关算法题

目录

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

代码示例:

go 复制代码
func searchInsert(nums []int, target int) int {
	left, right := 0, len(nums)-1
	var index int

	for left <= right {
		mid := left + (right-left)/2

		if target == nums[mid] {
			return mid
		} else if target < nums[mid] { //目标值在左区间
			right = mid - 1
			index = mid
		} else { //目标值在右区间
			left = mid + 1
			index = 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

代码示例:

go 复制代码
func searchRange(nums []int, target int) []int {
	leftBorder, rightBorder := -2, -2 //左边界和右边界, 不能使用-1, 因为当目标值等于数组最左边值时,此时leftBorder=-1
	left, right := 0, len(nums)-1     //二分法查找的左右索引

	//先找右边界
	for left <= right {
		mid := left + (right-left)/2

		if target < nums[mid] { //目标值在左区间
			right = mid - 1
		} else {
			left = mid + 1
			rightBorder = left
		}
	}

	//再找左边界
	left, right = 0, len(nums)-1
	for left <= right {
		mid := left + (right-left)/2

		if target > nums[mid] { //目标值在右区间
			left = mid + 1
		} else {
			right = mid - 1
			leftBorder = right
		}
	}

	//判断三种情况
	if leftBorder == -2 || rightBorder == -2 { //目标值在最左边之外rightBorder=-2或者目标值在最右边之外leftBorder=-2
		return []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

代码示例:

go 复制代码
func mySqrt(x int) int {
	left, right := 0, x
	var index int

	for left <= right {
		mid := left + (right-left)/2

		if mid*mid == x {
			return mid
		} else if mid*mid < x { //平方根在右区间
			left = mid + 1
			index = mid
		} else { //平方根在左区间
			right = mid - 1
			index = 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

代码示例如下:

go 复制代码
func isPerfectSquare(num int) bool {
	left, right := 1, num

	for left <= right {
		mid := left + (right-left)/2

		if mid*mid == num {
			return true
		} else if mid*mid > num { //目标值在左区间
			right = mid - 1
		} else { //目标值在右区间
			left = mid + 1
		}
	}

	return false
}
相关推荐
漂流瓶jz27 分钟前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
圣保罗的大教堂28 分钟前
leetcode 835. 图像重叠 中等
leetcode
叠层归一研究院2 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia3 小时前
Diffusion Model 的基本原理与模型架构
算法
wabs6664 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin034 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao5 小时前
算法50,分治归并,数组中的逆序对
java·算法
阳明山水5 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构
别动我齐刘海6 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人
zhangfeng11337 小时前
《从“人工适配“到“智能生成“:KernelSwift 跨国产芯片算子迁移全栈方案解读》 —— 强调范式跃迁和跨硬件属性,适合偏架构分析的写法
人工智能·算法·华为·ai编程·npu