2011年专业408

news2024/11/15 23:51:10

文章目录

  • 0 结果
  • 1 题目
  • 2 思路
    • 2.1 思路1(暴力解:排序)
    • 2.2 思路2(较优解:归并合并数组)
    • 2.3 思路3(较优解:数组指针后移)
    • 2.4 思路4(最优解:两个数组的折半查找)

0 结果

请添加图片描述

1 题目

请添加图片描述

2 思路

2.1 思路1(暴力解:排序)

将两个数组放入新的数组用快速排序,输出排序后数组中第n个元素。

#include <cstdio>
#include <cstdlib>
#include <algorithm>

//快排
void Qsort(int A[], int L, int R){
    if(L >= R) return;
    int pivot, i = L, j = R;
    std::swap(A[L], A[rand()%(R - L + 1) + L]);
    pivot = A[L];
    while(i < j){
        while(i < j && A[j] > pivot) j--;
        while(i < j && A[i] <= pivot) i++;
        if(i < j) std::swap(A[i], A[j]);
    }
    std::swap(A[L], A[i]);
    Qsort(A, L, i - 1);
    Qsort(A, i + 1, R);
}

void ans(int A[], int B[], int n){
    int* C = (int*) malloc(sizeof (int) * 2 * n);
    for(int i = 0;i < n;i++){//合并两个数组
        C[i] = A[i];
        C[n + i] = B[i];
    }
    Qsort(C, 0, 2*n - 1);
    printf("%d", C[n - 1]);//输出中位数
}

int main(){
    int A[] = {11, 13, 15,17, 19};
    int B[] = {2, 4, 6, 8, 20};
    ans(A, B, sizeof(A)/sizeof(A[0]));

    return  0;
}

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( n ) O(n) O(n)

2.2 思路2(较优解:归并合并数组)

对数组A和B使用归并的方式合并到新数组C中得到升序数组。

归并的方式为:给数组A和B的下标设置变量i和j,初始为0,每次比较A[i]和B[j],数组C的下一个空位保存较小的那个元素,并使对应的数组下标后移,直到一个数组遍历完,把另一个数组剩下的元素依次保存到数组C中。

#include <cstdio>
#include <cstdlib>


void ans(int A[], int B[], int n){
    int* C = (int*) malloc(sizeof (int) * n * 2);
    int i = 0, j = 0, index = 0;
    while(i < n && j < n){//归并合并
        if(A[i] < B[j]) C[index++] = A[i++];
        else C[index++] = B[j++];
    }
    while(i < n) C[index++] = A[i++];//处理剩余的元素
    while(j < n) C[index++] = B[j++];
    printf("%d", C[n - 1]);
}

int main(){
    int A[] = {11, 13, 15,17, 19};
    int B[] = {2, 4, 6, 8, 20};
    ans(A, B, sizeof(A)/sizeof(A[0]));

    return  0;
}

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

2.3 思路3(较优解:数组指针后移)

在上一种思路的基础上,不保存新的数组C。让数组A和B比较n-1次,到第n次时,此时A[i]和B[j]中较小的一个就会放在数组C的第n个位置上,即中位数。

#include <cstdio>
#include <algorithm>

void ans(int A[], int B[], int n){
    int i = 0, j = 0;
    for (int k = 1; k < n; ++k) {
        if(A[i] < B[j]) i++;
        else j++;
    }
    printf("%d", std::min(A[i], B[j]));
}

int main(){
    int A[] = {11, 13, 15,17, 19};
    int B[] = {2, 4, 6, 8, 20};
    ans(A, B, sizeof(A)/sizeof(A[0]));

    return  0;
}

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

2.4 思路4(最优解:两个数组的折半查找)

对数组A、B进行折半查找,设L1、R1为数组A的左右查找边界,L2,R2位数组B的左右查找边界。数组 A [ L 1 ∼ R 1 ] A[L_1 \sim R_1] A[L1R1] B [ L 2 ∼ R 2 ] B[L_2 \sim R_2] B[L2R2]的中位数,设为a和b,求序列A、B的中位数过程如下:

  • 1,若a < b,则舍弃序列A中较小的一半 A [ L 1 ∼ L m i d − 1 ] A[L_1 \sim L_{mid- 1}] A[L1Lmid1],同时舍弃序列B中较大的一半 B [ L m i d + 1 ∼ L R 2 ] B[L_{mid+1} \sim L_{R2}] B[Lmid+1LR2] ;
  • 2,若a >=b,则舍弃序列A中较大的一半 A [ L m i d + 1 ∼ L R 1 ] A[L_{mid+1} \sim L_{R1}] A[Lmid+1LR1],同时舍弃序列B中较小的一半 B [ L 2 ∼ L m i d − 1 ] B[L_2 \sim L_{mid- 1}] B[L2Lmid1] ;
  • 3,重复过程1,2,且保证序列A、B中的元素个数相同,如果不同,则从长的数组中舍弃一个(因为mid为向下取整,舍弃较小的那个),直到两个序列均只含一个元素时为止,较小者则为所求中位数。

例子:
序列A:11,3,15,17,19
序列B:2,4,6,8,20

轮次L1R1mid1L2R2mid2备注
1042042A[mid1] =15取左
B[mid2]=6取右
2021243A[mid1] =13取左
B[mid2]=8取右
3011343A[mid1] =11取左
B[mid2]=8取右
L2加1
4001444A[mid1] =11唯一
B[mid2]=20唯一
#include <cstdio>
#include <algorithm>

void ans(int A[], int B[], int n){
    int mid1, mid2, L1 =  0, L2 = 0, R1 = n- 1, R2 = n- 1;
    while (L1 < R1){
        mid1 = (L1 + R1)/2;
        mid2 = (L2 + R2)/2;
        if(A[mid1] < B[mid2]){
            L1 = mid1;
            R2 = mid2;
            if(R1 - L1 != R2 - L2)
                L1++;
        }else{
            R1 = mid1;
            L2 = mid2;
            if(R1 - L1 != R2 - L2)
                L2++;
        }
    }
    printf("%d", std::min(A[L1], B[L2]));
}

int main(){
    int A[] = {11, 13, 15,17, 19};
    int B[] = {2, 4, 6, 8, 20};
    ans(A, B, sizeof(A)/sizeof(A[0]));

    return  0;
}

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

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

相关文章

ARM BTI指令介绍

目录 一、JOP 二、BTI 三、启用BTI 四、BTI是怎么实现的 一、JOP JOP&#xff08;Jump-oriented programming&#xff09;类似于ROP&#xff08;Return-Oriented Programming&#xff09;。在 ROP 攻击中&#xff0c;会扫描出useful gadgets&#xff08;易被攻击的一段代码…

【数据结构】顺序队列的原理及实现

1.什么是队列 队列是一种比较特殊的线性表&#xff0c;特殊就在于它只允许在表的前端来进行删除&#xff0c;在表的后端来进行插入&#xff0c;队列它是一种操作受限制的线性表。插入的一端称为队尾&#xff0c;删除的一端称为队头&#xff0c;队列里没有元素就称它为空队列。…

快速使用代码编辑工具vim+ctags+cscope快捷使用itop3568开发板

当以上配置全部完成后&#xff0c;每当拿到新的工程代码&#xff0c;进入相关代码目录&#xff0c;利用 vim ./命令打 开当前目录&#xff0c; 然后 crtl 生成插件所需文件&#xff0c;最后使用命令:qa!退出 vim。此步只需进行一 次。 在此目录中打开任意代码文件或任意子目录…

jdk8新特性-日期时间

1、介绍 日期时间类在Java开发中是必不可少的&#xff0c;前后端如何传递时间参数、数据库的时间在Java中对应什么类型、Java中时间转换的各种方式有哪些&#xff1f; 2、Date类 Date类是JDK1.0时期推出来的第一代时间类&#xff0c;位于java.util包下&#xff0c;是最常用的…

unctf easy_serialize反序列化字符逃逸

&#xfeff;ctf题目平台&#xff1a;UNCTF - HACKING 4 FUN。web题难度适中 easy_serialize 题目源码&#xff1a; <?php include "function.php"; $action $_POST[action]; $name $_POST[name]; $pass $_POST[pass]; $email $_POST[email]; ​ function …

南京小米java面经(一面)

目录1.java支持多继承吗2.线程的生命周期3.线程和进程的区别4.单例模式有几种5.写一下双重锁的单例6.jvm有哪些区域7.jvm哪些区域是线程共享的&#xff0c;哪些是线程私有的8.gc中判断对象可回收的方式有哪些9.gc垃圾回收算法有哪些10.哪些对象可以作为gc root11.gc中的引用计数…

软件设计师教程(四)程序设计语言基础知识

软件设计师教程 软件设计师教程&#xff08;一&#xff09;计算机系统知识-计算机系统基础知识 软件设计师教程&#xff08;二&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;三&#xff09;计算机系统知识-计算机体系结构 程序设计语言知识软件设计师…

工资管理系统

一、系统简介 工资管理涉及企业管理的多个方面&#xff0c;如员工基本信息、员工在职离岗、员工考勤、员工加班等等。根据这些信息&#xff0c;在每个月的固定时间&#xff0c;生成全体员工的月工资&#xff0c;部门月工资以及全厂月工资。对于月工资&#xff0c;能够实现按照员…

机器学习【西瓜书/南瓜书】--- 第五章 神经网络

1.神经元模型 1.1 M-P神经元模型 输出函数&#xff1a; 其中θ为阈值&#xff0c; ω i为第i个神经元的连接权重&#xff0c; xi为来自第i个神经元的输入。 1.2 激活函数 阶跃函数&#xff1a; 理论上我们使用阶跃函数。将输入值映射为输出值为0/1&#xff0c;显然1为神经元…

Windows下编译安装OpenCASCADE

OpenCASCADE (以下简称OCC)是一套开源的几何建模系统&#xff0c;提供了曲面、实体等建模方式&#xff0c;已经广泛应用在CAD、CAE、CAM等软件开发。 OpenCASCADE官网已经提供OpenCASCADE的编译安装方法&#xff0c;本文结合实操过程&#xff0c;简述其过程。 零、环境 操作系…

Databend v0.9.0 版本发布

各位社区小伙伴们&#xff0c;历经数月开发&#xff0c;Databend 于 2023 年 1 月 13 日迎来了 v0.9.0 版本的正式发布&#xff01; 这次新版本是 Databend 迈向 1.0 版本的最后一个大版本&#xff0c;也是迄今为止我们对核心代码重构幅度最大的一个版本&#xff01;相较于 v0…

C++ string容器,cha*

目录 1.string基本概念 2.string构造函数,char* 3.string赋值操作 4.string字符串拼接,append 5.string查找和替换,find,replace 6.string字符串比较,compare 7.string字符存取[].at&#xff0c;取&#xff0c;修改单个字符&#xff0c;size返回字符串长度 8.string插入和…

数学建模学习笔记(13)分类模型

分类模型分类问题的基本概念逻辑斯蒂回归&#xff08;Logistic&#xff09;Fisher线性判别分析多分类问题的SPSS求解分类问题的基本概念 分类问题概述&#xff1a;对于给定的一个对象&#xff0c;根据其特征将其划分到多个已给定的类别中的一个。 二分类和多分类&#xff1a;…

题目:两数之和

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录描述描述 方式1:暴力遍历 public static int[] twoSum(int[] nums, int target) {int i 0;int j 1;int[] result new int[2];for(int m i;m<nums.length-1;m){…

13.3nm粒径水溶性Cds/CdTe-PAA-P4VP/BSA的制备方法

13.3nm粒径水溶性Cds/CdTe-PAA-P4VP/BSA的制备方法今天小编分享量子点偶联聚合物&#xff0c;一起看看吧&#xff1a;Cds/CdTe-PAA-P4VP/BSA的制备过程&#xff1a;称取86.5mgCdCl2于三口瓶中&#xff0c;加入295mL二次水&#xff08;考虑到在调pH值时会增加溶液的体积&#xf…

(14)工业界推荐系统-小红书推荐场景及内部实践【重排】

&#xff08;1&#xff09;工业界推荐系统-小红书推荐场景及内部实践【业务指标、链路、ItemCF】 &#xff08;2&#xff09;工业界推荐系统-小红书推荐场景及内部实践【UserCF、离线特征处理】 &#xff08;3&#xff09;工业界推荐系统-小红书推荐场景及内部实践【矩阵补充、…

目前音质最好的蓝牙耳机有哪些?2023公认音质最好的蓝牙耳机推荐

随着技术的进步&#xff0c;蓝牙耳机的功能也越来越多样&#xff0c;人们在选择蓝牙耳机时也更能够“精准”地搜索关键词&#xff0c;进行选择。不少人很注重蓝牙耳机的音质&#xff0c;最近看到不少人问&#xff0c;目前音质最好的蓝牙耳机有哪些&#xff1f;下面&#xff0c;…

如何录制视频课程?右下角带人脸的视频怎么录制

现如今网络十分发达&#xff0c;想学习知识也十分简单&#xff0c;只要在网上搜索你想要学习的内容&#xff0c;就会出现许多相关的视频课程。那您知道如何录制视频课程吗&#xff1f;在录制时如何录入人脸&#xff1f;其实一款专业的录屏软件就能轻松搞定。今天小编教大家使用…

分析一下spring循环依赖

1.为什么循环依赖是个问题 spring 中 Bean 的创建一定是经历创建对象和依赖注入两个步骤 假设对象 Bean_A 和 Bean_B 存在循环依赖&#xff0c;如下图 1.Bean_A 创建的时候需要 Bean_B&#xff0c;就会创建Bean_B 2.Bean_B创建的时候又需要Bean_A&#xff0c;又去创建Bean_A 3…

原创 140 多篇,是时候来篇总结了

光阴似剪&#xff0c;日月如梭。不知不觉&#xff0c;从 17 年广工毕业到现在&#xff0c;已经毕业 5 年多了。 从大四开始写博客&#xff0c;有原创 110 多篇, 也获得了 CSDN 博客专家称号和掘金优秀作者称号。 回想这五年来的程序员生涯&#xff0c;谈不上满意&#xff0c;也…