算法通关村第9关【黄金】| 两道有挑战的问题

news2024/12/26 21:18:18

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

思路:二分法,这个算法保证了每次选择的中间元素都能保持左右子树的高度差不超过 1,从而构建一个高度平衡的二叉搜索树。这个过程类似于分治法,通过递归不断将大问题分解成小问题并解决。

  1. 找到数组的中间元素,将它作为根节点。
  2. 以中间元素为界,将数组分成左右两个子数组。
  3. 递归地将左子数组构建为左子树,将右子数组构建为右子树。
  4. 返回根节点,连接左右子树。
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return trace(nums,0,nums.length - 1);
    }

    public TreeNode trace(int[] nums,int left,int right) {
        if(left>right){
            return null;
        }
        int mid = (right + left)/2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left = trace(nums,left,mid - 1);
        node.right = trace(nums,mid + 1,right);
        return node;
    }
}

2.寻找两个正序数组的中位数

 思路:找第k小的数字,每次抛弃k/2个数字

也就是奇数总数找第(len1+len2)/2的数字,偶数总数找第(len1+len2)/2和(len1+len2)/2 + 1的数字

 /* 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 进行比较

         * 这里的 "/" 表示整除

         * nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共计 k/2-1 个

         * nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共计 k/2-1 个

         * 取 pivot = min(pivot1, pivot2),两个数组中小于等于 pivot 的元素共计不会超过 (k/2-1) + (k/2-1) <= k-2 个

         * 这样 pivot 本身最大也只能是第 k-1 小的元素

         * 如果 pivot = pivot1,那么 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums1 数组

         * 如果 pivot = pivot2,那么 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums2 数组

         * 由于我们 "删除" 了一些元素(这些元素都比第 k 小的元素要小),因此需要修改 k 的值,减去删除的数的个数

         */

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int length1 = nums1.length, length2 = nums2.length;
        int totalLength = length1 + length2;
        if (totalLength % 2 == 1) {
            int midIndex = totalLength / 2;
            double median = getKthElement(nums1, nums2, midIndex + 1);
            return median;
        } else {
            int midIndex1 = totalLength / 2 - 1, midIndex2 = totalLength / 2;
            double median = (getKthElement(nums1, nums2, midIndex1 + 1) + getKthElement(nums1, nums2, midIndex2 + 1)) / 2.0;
            return median;
        }
    }

    public int getKthElement(int[] nums1, int[] nums2, int k) {
        int length1 = nums1.length, length2 = nums2.length;
        int index1 = 0, index2 = 0;
        int kthElement = 0;
        while (true) {
            // 边界情况
            if (index1 == length1) {
                return nums2[index2 + k - 1];
            }
            if (index2 == length2) {
                return nums1[index1 + k - 1];
            }
            if (k == 1) {
                return Math.min(nums1[index1], nums2[index2]);
            }
            
            // 正常情况
            int half = k / 2;
            int newIndex1 = Math.min(index1 + half, length1) - 1;
            int newIndex2 = Math.min(index2 + half, length2) - 1;
            int pivot1 = nums1[newIndex1], pivot2 = nums2[newIndex2];
            if (pivot1 <= pivot2) {
                k -= (newIndex1 - index1 + 1);
                index1 = newIndex1 + 1;
            } else {
                k -= (newIndex2 - index2 + 1);
                index2 = newIndex2 + 1;
            }
        }
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/954083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

和24考研说拜拜,不考研读中外合作办学硕士——人大女王金融硕士

23考研失利同学&#xff0c;大多都会有这样的疑虑&#xff0c;是再试一次还是选择其他方式呢&#xff1f;其实&#xff0c;并不用执着于全国联考&#xff0c;中外合作办学硕士或许更适合你。近年来&#xff0c;经济迅速发展&#xff0c;经济全球化不断扩大&#xff0c;金融方向…

怪兽充电连续两季度盈利,共享充电宝又行了?

智能手机的时代&#xff0c;“电量焦虑”是一个从未得到完美解决的问题。 彼得戴曼迪斯在《创业无畏》中写下&#xff1a;“世界上最大的问题等于最大的商机。” 近期&#xff0c;科技消费公司怪兽充电发布了2023年第二季度业绩报告。根据财报&#xff0c;怪兽充电第二季度实…

云计算中的负载均衡技术,确保资源的平衡分配

文章目录 1. 硬件负载均衡器2. 软件负载均衡器3. DNS负载均衡4. 内容分发网络&#xff08;CDN&#xff09; &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;云计算 ✨文章内…

【锁】定时任务推送数据-redission加锁实例优化

文章目录 redission 加锁代码-有问题优化代码看门狗是什么&#xff1f; redission 加锁代码-有问题 /*** 收货入库物料标签(包装码)推送接口** throws Exception*/public void synReceiveMaterialTags() throws Exception {String tag DateFormatUtils.format(new Date(), &qu…

操作系统中一些零散的知识点

第三章 内存管理 在虚拟内存系统中&#xff0c;虚拟内存的最大容量是由计算机的地址结构&#xff08;CPU寻址范围&#xff09;确定的&#xff0c;而虚拟内存的实际容量是受到“内存大小磁盘空间大小”、“地址线位数”共同制约&#xff0c;取二者最小值实现虚拟内存管理必须有…

手把手教你实现一个可编辑的Table

手把手教你实现一个可编辑的Table 需求背景 我们最近在做一些商品的备案工作&#xff0c;历史有很多的备案记录&#xff0c;不能很好的利用。所以想做一个提效工具。 备案人员&#xff0c;在网页通过搜索历史知识库的数据&#xff0c;进行备案编辑&#xff0c;他们平时都在使用…

亚马逊美国站上半年“日本商店”畅销品类了解一下吧!

近日&#xff0c;亚马逊美国站公布了2023年上半年“日本商店”&#xff08;JAPAN STORE&#xff09;的热门品类以及各品类销量排名前三的商品。据了解&#xff0c;亚马逊与日本贸易振兴机构 (JETRO) 合作&#xff0c;于2021年11月推出“日本商店”&#xff0c;支持日本卖家出海…

Vue安装过程的困惑解答——nodejs和vue关系、vue的项目结构

文章目录 一、为什么在使用vue前要下载nodejs&#xff1f;二、为什么安装nodejs后就能使用NPM包管理工具&#xff1f;三、为什么是V8引擎并且使用C实现&#xff1f;四、为什么会安装淘宝镜像&#xff1f;五、什么是webpack模板&#xff0c;为什么需要他&#xff1f;六、vue项目…

2023年中国电商销售额将达2.2万亿美元领跑全球

根据Global Data的数据&#xff0c;中国将继续保持在全球电子商务格局中的主导地位。预计中国电子商务市场将增长9.9%&#xff0c;到2023年将增长22亿美元。 2018年至2022年间&#xff0c;中国的在线销售额复合年增长率为11.2%。电商销售额在2022年达到了2万亿美元。预计2023年…

Python 实践之Pandas 时间数据处理方法详解

概要 表格数据中常见的数据类型是数值型&#xff08;包括整数、浮点数&#xff09;和字符型&#xff0c;除了这两种数据&#xff0c;时间类型数据也是常见数据的重要组成部分&#xff0c;同时也是数据分析中极其重要的信息。无论是金融领域的股票交易数据&#xff0c;还是企业注…

恒运资本:a股总市值怎么看?

跟着经济开展和金融商场的壮大&#xff0c;投资者越来越重视股市的行情。而对于A股商场来说&#xff0c;总市值是一个非常重要的目标。那么&#xff0c;A股总市值怎么看&#xff1f;以下是本文的详细剖析。 一、A股总市值界说与核算方法 首要需要了解A股总市值的界说和核算方法…

深度了解BSP452芯片特性与应用|百能云芯

在现代科技领域&#xff0c;芯片是推动各种电子设备发展的核心。BSP452作为一款重要的芯片&#xff0c;具有广泛的应用领域和独特的特性&#xff0c;为多个领域的创新提供了支持。百能云芯将深入探讨BSP452芯片的特点、应用领域以及未来发展前景。 BSP452芯片是一款N沟道MOS场效…

详细对比超融合服务器硬件平滑升级方案:新建集群 VS 滚动升级

作者&#xff1a;深耕行业的金融团队 刘慧敏 在企业 IT 基础架构运维中&#xff0c;经常会遇到以下问题&#xff0c;从而需要对服务器硬件进行更换或升级&#xff1a; 服务器达到维护期限&#xff1a;通常在金融行业中&#xff0c;生产环境的服务器维护期限在 5 年左右&#…

【进程间通信】管道

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

基于RabbitMQ的模拟消息队列需求文档

文章目录 一、项目背景二、需求分析1.核心概念2.BrokerServer核心组件3.核心API4.交换机类型5.持久化6.网络通信7.消息应答 三、消息队列模块划分 一、项目背景 什么是消息队列&#xff1f; 消息队列就是&#xff0c;基于阻塞队列&#xff0c;封装成一个独立的服务器程序&#…

springboot实战(一)之项目搭建

环境准备 ideajdk1.8springboot版本 2.7.15 项目开始 1.打开idea&#xff0c;点击new project 2.选择spring initillizr 核对&#xff1a;Server Url是否是&#xff1a;start.spring.io&#xff0c;然后根据自己依次设置项目名称、存储位置和包名&#xff0c;如下&#xff…

洛朗展式求留数方法计算超越函数f(x)=e^(cosx)的定积分

https://math.stackexchange.com/questions/2468863/what-is-the-integral-of-e-cos-x https://tieba.baidu.com/p/6881253594 例子 https://www.zhihu.com/question/441124046/answer/1697123609?utm_id0

《Kubernets证书篇:kubernetes1.24.17证书修改时间限制》

一、背景 Kubernetes 默认的证书有效期只有1年,因此需要每年手动更新一次节点上面的证书,特别麻烦而且更新过程中可能会出现问题,因此我们要对 Kubernetes 的 SSL 证书有效期进行修改,这里将证书的时间限制修改为100年。 环境信息如下: 操作系统内核版本K8S版本Ubuntu 20.…

百度的AI画图和讯飞的AI画图目前就这样了

今天接到百度的短信&#xff0c;说给我一个搜索AI的测试权限&#xff0c;心血来潮&#xff0c;让AI给我做个画&#xff0c;百度和讯飞来做个PK&#xff0c;结果都不敢恭维哈&#xff0c;双方都有待提高&#xff0c;加油&#xff01;

代码解读 FCOS网络(基于mmrotate框架)

文章目录 1. rotated_fcos_head.py1.1 __init__函数1.2 forward_single 函数1.2.1 父类的forward_single 函数&#xff08;anchor_free_head.py&#xff09;1.2.2 _init_layers 函数 1.3 loss 函数1.3.1 get_targets 函数1.3.1.1 _get_target_single 函数 1.3.2 prior_generato…