Ex 2_14 去掉数组中所有重复的元素..._第二次作业


首先利用归并排序算法对数组进行排序,时间复杂度为O(nlogn),接着再利用时间复杂度为O(n) 的去重复算法去掉数组中的重复元素。总的时间复杂度为O(nlogn)。
(这题应该用分支算法解决)以下为分支算法

代码不是分支算法
package org.xiu68.ch02.ex2;
public class Ex2_14 {
//基于分治法的归并排序算法
public static void main(String[] args) {
int[] a=new int[]{5,5,4,4,3,3,3,2,2,1,1};
//先归并排序数组,时间复杂度为O(nlog2n)
mergeSort(a, a.length-1);
int min=a[0]-1;
//去掉有序数组中的重复元素,时间复杂度为O(n)
removeSame(a);
//总的时间复杂度为O(nlog2n)
for(int i=0;i<a.length;i++){
if(a[i]!=min)
System.out.print(a[i]+" ");
}
}
//一次归并,二并一
public static void merge(int[] start,int[] result,int s,int m,int t){
//s,m+1为两个有序序列的第一个记录,t为第二个序列的最后一个记录
int i=s;
int j=m+1;
int k=s;
while(i<=m && j<=t)
if(start[i]<=start[j]) //取start[i]和start[j]的最小者放入result[k]
result[k++]=start[i++];
else
result[k++]=start[j++];
if(i<=m) //第一个序列没有遍历完
while(i<=m)
result[k++]=start[i++];
else //第二个序列没有遍历完
while(j<=t)
result[k++]=start[j++];
}
//一趟排序,h为序列长度
public static void mergePass(int[] start,int[] result,int n,int h){
int i=0;
while(i<=n-2*h+1){
merge(start,result,i,i+h-1,i+2*h-1);
i+=2*h;
}
if(i<n-h+1)
merge(start,result,i,i+h-1,n);
else
for(int k=i;k<=n;k++)
result[k]=start[k];
}
//归并排序
public static void mergeSort(int[] start,int n){
int h=1;
int[] result=new int[n+1];
while(h<n){
mergePass(start, result, n, h);
h=2*h;
mergePass(result, start, n, h);
h=2*h;
}
}
//去掉数组中重复的部分
public static void removeSame(int[] a){
int min=a[0]-1; //把数组中的重复部分设置为min
for(int i=0;i<a.length;){
int j=i+1;
while(j<a.length && a[i]==a[j]){
a[j]=min;
j++;
}
i=j;
}//for
}
}
Ex 2_14 去掉数组中所有重复的元素..._第二次作业的更多相关文章
- 利用js对象的特性,去掉数组中的重复项
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- javascript 返回数组中不重复的元素
这是实现结构伪类type-of-type的部分代码: <script type="text/javascript"> var ret= ["span" ...
- js中 在数组中删除重复的元素(自保留一个)
例如:var student = [‘qiang’,’ming’,’tao’,’li’,’liang’,’you’,’qiang’,’tao’]; 第一种思路是:遍历要删除的数组arr, 把元素分别放 ...
- (转)js在数组中删除重复的元素自保留一个(两种实现思路)
例如:var student = [‘qiang','ming','tao','li','liang','you','qiang','tao']; 第一种思路是:遍历要删除的数组arr, 把元素分别放 ...
- Ex 2_23 如果一个数组超过半数的元素都相同时,该数组被称为含有一个主元素..._第二次作业
将数组A划分为两个数组A1和A2 ,各含有A的一半元素或一半多一个.若A中含有主元素x,则A1和A2中至少有一个数组含有主元素x,对A1和A2递归地计算有无主元素,若A只含有一个元素,则A的主元素就是 ...
- 利用js对象的特性,去掉数组中的重复项
- js学习笔记之在数组中删除重复的元素自保留一个
遍历要删除的数组arr, 把元素分别放入另一个数组tmp中,在判断该元素在arr中不存在才允许放入tmp中 <script type="text/javascript"> ...
- JavaScript去除数组中的重复值
用原型函数(prototype)可以定义一些很方便的自定义函数,实现各种自定义功能. Javascript 中的原型函数(prototype)的工作原理,在 javascript 中每次声明新函数的过 ...
- 去掉有序数组中的重复元素 c/c++
去掉有序数组中的重复元素: int RemoveDuplates(int A[], int nCnt) { ; ; , j = ; i < nCnt && j < nCnt ...
随机推荐
- tomcat源码研究之源码导入eclipse
版本:8.5.x官网:https://tomcat.apache.org/svn.html1. 下载源码,git镜像:https://github.com/apache/tomcat85 .2. 导入 ...
- java定时器实现总结
前言:Java定时器目前主要有3种实现方式:JDK组件,Spring Task,Quartz框架. 1. JDK组件(1) java.util.TimerTask MyTimerTask.java: ...
- SpringBoot系列: Redis 共享Session
Web项目Session管理是一个很重要的话题, 涉及到系统横向扩展, SpringBoot已经为共享Session很好的解决方案, 这篇文章关注使用Redis共享会话, 同时这也是最常用的方法. = ...
- vue 组件动态 循环
组件可以是动态的,记录如下 <div v-for="item in arrComponent"> <component v-bind:is="item. ...
- 数据库范式:1NF,2NF,3NF,BCNF浅析
在设计与操作维护数据库时,最关键的问题就是要确保数据能够正确地分布到数据库的表中.使用正确的数据结构,不仅有助于对数据库进行相应的存取操作,还可以极大地简化应用程序中的其他内容(查询.窗体.报表.代码 ...
- Immunity Debugger学习 二
1.Exploit开发 发现漏洞只是一个开始,在你完成利用程序之前,还有很长一段路要走.不过Immunity专门为了这项任务做了许多专门设计,相信能帮你减少不少痛苦.接下来我们开发一些PyComman ...
- Centos下查看mysql的版本
判断是否安装了mysql 输入 whereis mysql 如果安装了会显示mysql的安装所在路径 方法1:使用mysql -v命令查看: 1 2 3 4 [root@yeebian mysql ...
- leetcode 90. subsets
解题思路: 要生成子集,对于vector 中的每个数,对于每个子集有两种情况,加入或不加入. 因此代码: class Solution { public: void subsetG(vector< ...
- 使用PHP+MySql操作——实现微信投票功能
1. 投票主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- 深度理解PHP中for与foreach两个循环结构遍历数组的区别
遍历一个数组是编程中最常见不过的了,这里讨论下for和foreach两种方法: 首先,我们先准备两个用于遍历的数组: $arr1=array(1=>'a', 3=>22, 5=>'b ...