文章目录

  • 题目
    • 数组合并
    • 归并排序
    • 第k小元素问题
    • 找中位数
    • 棋盘覆盖问题
    • 大整数乘法

题目

数组合并

题目描述
编写一个程序,将两个有序数组合并成一个更大的有序数组,要求时间复杂度为O(n)。
输入
多组数据输入,每组输入包括两行,每行第一个数字为数组长度n,然后输入n个有序整数。
输出
输出合并后的数组(升序),每组输出用一个空行隔开。
样例输入 Copy
3 1 3 5
3 2 4 6
2 1 2
4 3 4 5 6
样例输出 Copy
1 2 3 4 5 6

1 2 3 4 5 6

import java.util.Scanner;
public class Main {public static void mergesort(int sr[],int s,int t) {int[] tr=new int[t+1];if(s<t) {int m=(s+t)/2;mergesort(sr,s,m);mergesort(sr,m+1,t);merge(sr,tr,s,m,t);for(int i=s;i<=t;i++) {sr[i]=tr[i];}
}
}
public static void merge(int sr[],int tr[],int s,int m,int t) {int i=s,j=m+1,k=s;while(i<=m&&j<=t) {if(sr[i]<=sr[j]) tr[k++]=sr[i++];else tr[k++]=sr[j++];}while(i<=m) tr[k++]=sr[i++];while(j<=t) tr[k++]=sr[j++];
}public static void main(String[] args) {// TODO Auto-generated method stubScanner cin=new Scanner(System.in);while(cin.hasNext()) {int n1=cin.nextInt();int[] na=new int[n1];for(int i=0;i<n1;i++) {na[i]=cin.nextInt();}int n2=cin.nextInt();int[] nb=new int[n2];for(int i=0;i<n2;i++) {nb[i]=cin.nextInt();}int[] nab=new int[n1+n2];System.arraycopy(na, 0, nab, 0, n1);System.arraycopy(nb, 0, nab, n1, n2);mergesort(nab,0,n1+n2-1);for(int i=0;i<nab.length;i++){System.out.print(nab[i]+" ");}System.out.println("\n");}System.out.println("\n");}}

归并排序

题目描述
编写一个程序,使用分治策略实现二路归并排序(升序)。
输入
多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。
输出
输出排序之后(升序)的一维整型数组,每组输出占一行。
样例输入 Copy
6 1 8 6 5 3 4
5 12 42 2 5 8
样例输出 Copy
1 3 4 5 6 8
2 5 8 12 42

import java.util.Scanner;
public class Main {public static void mergesort(int sr[],int s,int t) {int[] tr=new int[t+1];if(s<t) {int m=(s+t)/2;mergesort(sr,s,m);mergesort(sr,m+1,t);merge(sr,tr,s,m,t);for(int i=s;i<=t;i++) {sr[i]=tr[i];}
}
}
public static void merge(int sr[],int tr[],int s,int m,int t) {int i=s,j=m+1,k=s;while(i<=m&&j<=t) {if(sr[i]<=sr[j]) tr[k++]=sr[i++];else tr[k++]=sr[j++];}while(i<=m) tr[k++]=sr[i++];while(j<=t) tr[k++]=sr[j++];
}public static void main(String[] args) {// TODO Auto-generated method stubScanner cin=new Scanner(System.in);while(cin.hasNext()) {int n1=cin.nextInt();int[] na=new int[n1];for(int i=0;i<n1;i++) {na[i]=cin.nextInt();}mergesort(na,0,n1-1);for(int i=0;i<na.length;i++){System.out.print(na[i]+" ");}System.out.println();}}}

第k小元素问题

题目描述
输入一个整数数组,请求出该数组的第k小元素。要求时间复杂度为O(n)。
输入
每组输入包括两行,第一行为一个整数数组,两个数字之间用空格隔开;第二行为k值。数组中元素个数小于10^9。
输出
输出第k小元素的值。
样例输入 Copy
2 5 6 1 8 7 9
2
样例输出 Copy
2

import java.util.Scanner;
public class Main {  public static int quickSelect(int a[],int s,int t,int k){if(s==t) return a[s];int i=partition(a,s,t);int j=i-s+1;if(k<=j) return quickSelect(a,s,i,k);else return quickSelect(a,i+1,t,k-j);}public static int partition(int a[],int p,int q) {int x=a[p];int i=p;int j;for(j=p+1;j<q;j++) {if(a[j]<=x) {i++;swap(a,i,j);}}swap(a,p,i);return i;}public static void swap(int a[],int i,int j) {int t;t=a[i];a[i]=a[j];a[j]=t;}public static void main(String[] args) {// TODO Auto-generated method stubScanner cin=new Scanner(System.in);while(cin.hasNext()) {String str=cin.nextLine();String str0=cin.nextLine();int k=Integer.parseInt(str0);String[] str1=str.split(" ");int[] a=new int[str1.length];for(int i=0;i<a.length;i++) {a[i]=Integer.parseInt(str1[i]);}int res=quickSelect(a,0,a.length,k);System.out.println(res);}}}

找中位数

题目描述
请设计一个算法,不排序,快速计算出一个无序数列的中位数。 时间复杂度要求为O(n)。
如果有奇数个元素,中位数则是数组排序后最中间的那个数字。
如果是偶数个元素,中位数则是数组排序后最中间两个元素的平均值。
输入
有多组输入,每组输入的第一行为n(1<=n<=1e5),表示该数列的元素个数。
第二行为n个整数组成的无序数列
输出
每组样例输出一行,表示该无序数列的中位数。
若为偶数,请保留三位小数
若为奇数,直接输出
样例输入 Copy
5
5 3 2 1 4
样例输出 Copy
3

import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {  public static int quickSelect(int a[],int s,int t,int k){if(s==t) return a[s];int i=partition(a,s,t);int j=i-s+1;if(k<=j) return quickSelect(a,s,i,k);else return quickSelect(a,i+1,t,k-j);}public static int partition(int a[],int p,int q) {int x=a[p];int i=p;int j;for(j=p+1;j<q;j++) {if(a[j]<=x) {i++;swap(a,i,j);}}swap(a,p,i);return i;}public static void swap(int a[],int i,int j) {int t;t=a[i];a[i]=a[j];a[j]=t;}public static void main(String[] args) {// TODO Auto-generated method stubScanner cin=new Scanner(System.in);while(cin.hasNext()) {int num=cin.nextInt();int[] a=new int[num];for(int i=0;i<a.length;i++) {a[i]=cin.nextInt();}int k,k1,k2,res,res1,res2;double res3;if(num%2!=0) {k=(a.length+1)/2;res=quickSelect(a,0,a.length,k);System.out.println(res);}else{k1=a.length/2;k2=k1+1;res1=quickSelect(a,0,a.length,k1);res2=quickSelect(a,0,a.length,k2);res3=(res1+res2)/2.0;DecimalFormat df2  = new DecimalFormat("###.000");//保留三位小数System.out.println(df2.format(res3));}}}}

棋盘覆盖问题

题目描述
在一个n×n (n = 2k)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。
在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

输入
多组测试用例,每组测试用例包括两部分,
第一部分为方格的宽度n,
第二部分则为方格,特殊方格为-1,其他方格为0。

输出
输出覆盖后的方案
样例输入 Copy
4
-1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
样例输出 Copy
-1 2 4 4
2 2 1 4
3 1 1 5
3 3 5 5

import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {static int tile=1;public static void chessBoard(int board[][],int tr,int tc,int dr,int dc,int size) {if(size==1) return ;int t=tile++,//L型骨牌号s=size/2;//分割棋盘//覆盖左上角棋盘if(dr<tr+s&&dc<tc+s)//特殊方格在此棋盘chessBoard(board,tr,tc,dr,dc,s);else {//此棋盘中无特殊方格//用t号L型骨牌覆盖右下角board[tr+s-1][tc+s-1]=t;//覆盖其余方格chessBoard(board,tr,tc,tr+s-1,tc+s-1,s);}//覆盖左下角棋盘if(dr>=tr+s&&dc<tc+s)//特殊方格在此棋盘chessBoard(board,tr+s,tc,dr,dc,s);else {//此棋盘中无特殊方格//用t号L型骨牌覆盖右上角board[tr+s][tc+s-1]=t;//覆盖其余方格chessBoard(board,tr+s,tc,tr+s,tc+s-1,s);}//覆盖右上角棋盘if(dr<tr+s&&dc>=tc+s)//特殊方格在此棋盘chessBoard(board,tr,tc+s,dr,dc,s);else {//此棋盘中无特殊方格//用t号L型骨牌覆盖左下角board[tr+s-1][tc+s]=t;//覆盖其余方格chessBoard(board,tr,tc+s,tr+s-1,tc+s,s);}//覆盖右下角棋盘if(dr>=tr+s&&dc>=tc+s)//特殊方格在此棋盘chessBoard(board,tr,tc,dr,dc,s);else {//此棋盘中无特殊方格//用t号L型骨牌覆盖左上角board[tr+s][tc+s]=t;//覆盖其余方格chessBoard(board,tr+s,tc+s,tr+s,tc+s,s);}}public static void main(String[] args) {// TODO Auto-generated method stubScanner cin=new Scanner(System.in);while(cin.hasNextInt()) {tile=1;int w=cin.nextInt();int[][] chess=new int[w][w];int tr=1,tc=1,dr=0,dc=0;for(int i=0;i<w;i++){for(int j=0;j<w;j++){chess[i][j]=cin.nextInt();if(chess[i][j]==-1){dr=i+1;dc=j+1;}}}chessBoard(chess,tr-1,tc-1,dr-1,dc-1,w);for(int i=0;i<w;i++){for(int j=0;j<w;j++){System.out.print(chess[i][j]+" ");}System.out.print("\n");}}}}

大整数乘法

题目描述
使用分治算法实现两个大整数相乘。
输入
两个十进制大整数,满足每一个整数长度为2^n且两个大整数的长度相等。(多组数据)

输出
两个大整数的乘积。
样例输入 Copy
1234 5678
样例输出 Copy
7006652

import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {public static int judge(long a) {for(int i=1;;i++) {if(a/10==0) return i;else a=a/10;}}public static int sign(long s) {return s>0?1:-1;}public static long jisuan(long x,long y,int n) {int s=sign(x)*sign(y);x=Math.abs(x);y=Math.abs(y);if(x==0||y==0)return 0;else if(n==1)return s*x*y;else {long A=(long) (x/Math.pow(10,n/2));long B= (x%(long)Math.pow(10,n/2));long C=(long) (y/Math.pow(10,n/2));long D= (y%(long)Math.pow(10,n/2));long AC=jisuan(A,C,n/2);long BD=jisuan(B,D,n/2);long ABCD=jisuan(A-B,D-C,n/2)+AC+BD;return (long) (s*(AC*Math.pow(10, n)+ABCD*Math.pow(10,n/2)+BD));}}public static void main(String[] args) {// TODO Auto-generated method stubScanner cin=new Scanner(System.in);while(cin.hasNextInt()) {long a=cin.nextInt();long b=cin.nextInt();int n=judge(a);long sum=jisuan(a,b,n);System.out.println(sum);}}}

练习六(归并排序、第k小元素、棋盘覆盖、大整数乘法)相关推荐

  1. 寻找中项和第k小元素c语言,分治法第k小元素poj2104.ppt

    分治法第k小元素poj2104 第六章 分 治 6.1 引言 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之. 战略 算法设计技术 划分--治理- ...

  2. 算法-寻找第k小元素(C)

    序言 刚开始我认为,寻找第k小的元素:简单呀,先对所有元素排序,之后再找不就完事啦,这时时间复杂度在O(nlgn).那有没有更好的排序的方法了呢?答案:当然是有的. 算法基本思路: (1) 当规模小于 ...

  3. 实验6-选第K小元素

    实验报告 课程名称 <算法分析与设计> 实验日期 2021 年 4 月 18 日 至 2021 年 4 月 25日 学生姓名 石晨昊 所在班级 计算机194 学号 201921221232 ...

  4. 求第k小元素:采用特定分治策略

    问题[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)]设L是n个元素的集合,从L中选取第k小的元素,其中1<=k<=n.这里的第k小元素是指,当L按从小到大排好 ...

  5. python第k序列元素查找_python查找第k小元素代码分享 -电脑资料

    复制代码代码如下: # -*- coding: utf-8 -*- from random import randint from math import ceil, floor def _parti ...

  6. 二叉搜索树第k小元素

    二叉搜索树第k小元素 二叉搜索树的中序遍历是一个递增的序列(左根右) 中序遍历完整二叉搜索树,每次将遍历到的节点存入数组中去,找到第k - 1个节点返回即可 k是从下标1开始的,存到结果数组res中, ...

  7. 分治算法 求第k小元素 O(n) O(nlog2^n)

    BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排) 各位小伙伴,由于本篇文章代码太过杂乱.我于 2018年12月25日 对文中介绍的算法进行了重写.点击上面的蓝色字体,可以阅读重写后的 ...

  8. 清橙OJ 1082 查找第K小元素 -- 快速排序

    题目地址:http://oj.tsinsen.com/A1082 问题描述 给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素. 这是一个补充程序的试题,你需要完成一个函数: int fi ...

  9. 快速排序_查找第k小元素

    快速排序_查找第k小元素 以下代码可以从数组a[]中找出第k小的元素. 它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的. 请仔细阅读分析源码,填写划线部分缺失的内容. 一个问题,快排你的 ...

最新文章

  1. 1行代码实现Python数据分析:图表美观清晰,自带对比功能丨开源
  2. HTML常见标签易踩坑笔记(一)
  3. SCCM部署操作系统失败:MP has rejected a request
  4. 基于Win10极简SonarQube C#代码质量分析
  5. ldd /usr/bin/mysql_mysql客户端登录时报mysql: relocation error错误
  6. android区域截图app,【干货】最新App应用市场截图尺寸大全
  7. html5仿qq空间,JS实现的仿QQ空间图片弹出效果代码
  8. ActionForm
  9. android 清除应用程序数据,清除Android应用程序用户数据
  10. 你的微信还安全吗?揭露清理僵尸粉的连环骗局
  11. cdoj 1092 韩爷的梦
  12. Kruscal算法---最小生成树
  13. 高德地图定位误差_导航定位错误致拥堵,四川景区建议别用高德地图 高德回应...
  14. POJ_3984迷宫问题(bfs基础题)
  15. 微信堆木头html5小游戏源码
  16. 关于商业计划书(Business Project,以下简称BP)写作那些事儿(一)
  17. python读取tiff图像,浅谈python下tiff图像的读取和保存方法
  18. 加拿大滑铁卢大学计算机世界排名,滑铁卢大学世界排名
  19. 大数据可视化技术——平行坐标图、成对关系图、高级折线图
  20. SEDA(Staged Event-Driven Architecture)

热门文章

  1. 范式1NF,2NF,3NF
  2. REDIS11_HyperLogLog的概述、基本命令、UV、PV、DAU、MAU、首页UV如何进行统计处理
  3. SpringEL 表达式语言(Spring Expression Language)
  4. modem与baseband
  5. ResNet、ResNeXt网络详解及复现
  6. 计算机音乐我的天空,南征北战NZBZ《我的天空》[FLAC/MP3-320k]
  7. 盘点OLED显示技术的几大优势
  8. java使用jol打印对象信息
  9. 智能识别收货地址 javascript
  10. Python evel函数