2011年专业408算法题

news2024/11/24 3:29:23

文章目录

  • 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/185373.html

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

相关文章

webpack是如何进行依赖图谱收集的?

我自己学习webpack已有很长时间了&#xff0c;但是经常会遇到这样的问题: 可以熟练配置webpack的一些常用配置&#xff0c;但是对一些不常见的api或者概念总是云里雾里。因此&#xff0c;对着网上资料手写了一个简易版的webpack&#xff0c;现在对其中的依赖图谱收集部分进行梳…

Numpy(7)—字节交换、NumPy 副本和视图、深浅拷贝、矩阵库、NumPy 线性代数、NumPy IO(读写)、NumPy Matplotlib

1.字节交换 import numpy as npA np.array([1, 256, 8755], dtypenp.int16) print(A) print(list(map(hex, A))) print(A.byteswap(inplaceTrue)) print(list(map(hex, A)))2.NumPy 副本和视图 副本是一个数据的完整的拷贝&#xff0c;如果我们对副本进行修改&#xff0c;它不…

【MyBatis 持久层框架】Mapper代理开发详细解读

文章目录1. 前言2. Mapper 代理开发3. 过程剖析4. 总结1. 前言 前面在 MyBatis 快速入门篇中&#xff0c;我们使用了 MyBatis 原生的开发方式操作数据库&#xff0c;解决了 JDBC 操作数据库时的硬编码和操作繁琐的问题。实际上&#xff0c;在 Java 项目中&#xff0c;我们更常…

python3——函数

目录 一、函数定义 二、函数调用 1.打印Hello World 2.判断最大值 3.计算矩形面积 4.help说明文档 三、参数传递 (一)位置参数 (二)关键字参数 (三)默认参数(缺省参数) (四)可变参数(收集参数) 1.位置可变参数(接收所有的位置参数&#xff0c;返回一个元组) 2.关键…

高通开发系列 - MSM8909 lk aboot阶段点灯操作

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 第一种LK提供的接口实现第二种直接操作寄存器这篇文章之前请参考下:高通开发系列 - MSM8909指示灯操作 在LK中点灯有两种方式,一种…

JAVA-定位排查bug

在开发过程中难免会遇到bug&#xff0c;理解bug的含义&#xff0c;定位bug的位置&#xff0c;对于解决bug至关重要&#xff01;掌握高效的排错技巧&#xff0c;对于程序员来说必不可少。 目录 一、错误异常的分类 二、常见报错信息及原因&#xff08;持续更新中&#xff09;…

域内权限维持:AdminSDHolder

01、简介 AdminSDHolder是一个特殊的AD容器&#xff0c;通常作为某些特权组成员的对象的安全模板。Active Directory将采用AdminSDHolder对象的ACL并定期将其应用于所有受保护的AD账户和组&#xff0c;以防止意外和无意的修改并确保对这些对象的访问是安全的。如果攻击者能完全…

Flex布局和主要属性用法详解

目录 前言 一个小例子 基本概念&#xff1a; 设置在主轴上的排列方式 设置在侧轴上的排列方式 更换主轴和侧轴方向 换行 align-content属性 元素&#xff08;子容器&#xff09;的相关属性 flex-basis flex-grow flex-shrink属性 flex属性 前言 flex布局是继标准…

JDBC-Statement

1.Statement执行静态sql语句&#xff08;“字符串”&#xff09; 返回结果 2.&#xff01;实际工作一般用PreparedStatement来进行sql语句的执行&#xff0c;因为sql注入的风险 3and4.SQl注入就是Statement没有检查我们输入sql语句&#xff0c;一些别有用心的可能写一些危害数据…

智能手表主控芯片盘点,智能手表GUI,智能手表市场

聚焦&#xff1a;无线连接芯片&#xff0c;市场&#xff0c;技术 祝大家新年快乐&#xff0c;开工大吉&#xff01;趁寒假简单梳理了下智能手表应用&#xff0c;做个分享&#xff0c;不对的地方欢迎交流指正&#xff1b; 01 市场容量&#xff0c;分类及拓扑 2个数据供参考 一个…

C++ dll、lib 的定义以及引用,

最近在研究socket&#xff0c;发现socket程序要依赖ws2_32.dll,涉及到动态链接库&#xff0c;有点懵&#xff0c;上网恶补了一下链接库的知识&#xff0c;最后总结出这么一篇文章 链接库分为两种&#xff1a;动态链接库(dll) 和静态链接库(lib) 动态链接库 &#xff1a; 动态链…

【C++】C++11语法解析

&#x1f308;欢迎来到C专栏~~C11 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x1f…

大数据分析案例-基于多元线性回归算法构建用户信用评分模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

ue4c++日记9(指定区域生成角色)

目录 创建C类 头文件 代码文件 结果 创建C类 头文件 // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "ASPawnVolum.generated…

vSphere with Tanzu概念介绍

vSphere with Tanzu是在vSphere7.0及之后出现的新功能&#xff0c;它可以在虚拟化层创建一个Kubernetes 控制平面&#xff0c;并将vSphere 集群资源转化为Kubernetes集群资源&#xff0c;这样可以直接在ESXI主机上运行Kubernetes工作负载&#xff0c;创建Kubernetes集群并部署容…

测试环境频繁Full GC问题的解决思路

背景 上游调用方&#xff0c;反馈当前welink-front服务不可用&#xff1b; 临时解决办法 手动重启welink-front服务&#xff0c;重启之后观测到业务日志正常刷&#xff0c;说明该问题暂时得到了解决&#xff1b; 但没过多久&#xff0c;上游调用方的同学又找来了&#xff0…

C++ 继承

一. 概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对程序设计的层次结构&#xff0c;体现了由…

IDEA开发 常用代码规范插件 常用辅助类插件

规范类 阿里巴巴规范 Alibaba Java Coding Guidelines 插件地址 阿里官方出的开源的代码规范插件 GitHub地址 配合阿里出的规范手册《码出高效 Java开发手册》食用效果更佳 不用购买哈&#xff01;GitHub上开源的 码出高效&#xff1a;Java开发手册下载 静态代码检查 Sonar…

数学建模学习笔记(14)聚类模型

聚类模型K均值聚类算法和K均值聚类算法系统聚类算法&#xff08;层次聚类&#xff09;DBSCAN聚类算法聚类问题概述&#xff1a;把样本划分为由相似的对象组成的多个类的过程。 K均值聚类算法和K均值聚类算法 K均值聚类算法流程&#xff1a; 指定需要划分的簇的个数K。随机选…

【Redis | 黑马点评】商户查询缓存

文章目录什么是缓存&#xff1f;添加商户缓存缓存更新策略主动更新策略实现商铺查询的缓存与数据库双写一致缓存穿透问题的解决思路编码解决商品查询的缓存穿透问题缓存雪崩问题及解决思路缓存击穿问题及解决思路基于互斥锁的方式解决缓存击穿问题基于逻辑过期的方式解决缓存击…