算法学习 13

1.将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。

示例 1:

复制代码
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

复制代码
输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
java 复制代码
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return helper(nums, 0, nums.length - 1);
    }

    public TreeNode helper(int[] nums, int left, int right) {
        if (left > right) {
            return null;
        }

        // 总是选择中间位置左边的数字作为根节点
        int mid = (left + right) / 2;

        TreeNode root = new TreeNode(nums[mid]);
        root.left = helper(nums, left, mid - 1);
        root.right = helper(nums, mid + 1, right);
        return root;
    }
}

2.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 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
java 复制代码
class Solution {
    // 方法返回值应为int,而非int数组
    public int searchInsert(int[] nums, int target) {
        int n = nums.length;
        
        // 遍历数组查找目标值
        for (int j = 0; j < n; j++) {
            // 如果找到目标值,返回当前索引
            if (nums[j] == target) {
                return j;
            }
            // 如果当前元素大于目标值,说明目标值应插入到当前位置
            if (nums[j] > target) {
                return j;
            }
        }
        
        // 如果所有元素都小于目标值,插入到数组末尾
        return n;
    }
}
    
相关推荐
June`3 小时前
前缀和算法:高效解决区间和问题
算法·1024程序员节
再卷也是菜3 小时前
算法基础篇(9)倍增与离散化
c++·算法
pearlthriving4 小时前
list的介绍
数据结构·list·1024程序员节
Lei_3359675 小时前
[数据结构]哈希表、字符串哈希
数据结构·哈希算法·散列表
微露清风6 小时前
系统性学习C++-第八讲-vector类
java·c++·学习
给大佬递杯卡布奇诺6 小时前
FFmpeg 基本数据结构 AVInputFormat 分析
数据结构·c++·ffmpeg·音视频
月临水6 小时前
Git 学习笔记
笔记·git·学习·1024程序员节
ゞ 正在缓冲99%…6 小时前
leetcode2826.将三个组排序
算法·leetcode·动态规划
奋斗的牛马6 小时前
FPGA—ZYNQ学习Debug(三)
学习·fpga开发