爪哇国新游记之二十二----排序判断重复时间复杂度为2n的位图法
import java.util.ArrayList;
import java.util.List;
/**
* 位图法
* 用于整型数组判重复,得到无重复列表
*
*/
public class Bit{
int max;
int min;
int[] arr;
public Bit(int[] arrInput){
// 找出极值
for(int i=0;i<arrInput.length;i++){
if(max<arrInput[i]){
max=arrInput[i];
}
if(min>arrInput[i]){
min=arrInput[i];
}
}
// 新建数组
arr=new int[max-min+1];
// 数组插值
for(int i:arrInput){
int index=i-min;
arr[index]++;
}
}
/**
* 判断有无元素重复
* @return
*/
public boolean hasDuplicateItem(){
for(int i=0;i<arr.length;i++){
int value=arr[i];
if(value>1){
return true;
}
}
return false;
}
/**
* 得到已排序的元素列表,有重复
* @return
*/
public List<Integer> getSortedList(){
List<Integer> ls=new ArrayList<Integer>();
for(int i=0;i<arr.length;i++){
int value=arr[i];
if(value!=0){
for(int j=0;j<value;j++){
ls.add(min+i);
}
}
}
return ls;
}
/**
* 得到已排序的元素列表,无重复
* @return
*/
public List<Integer> getUniqueSortedList(){
List<Integer> ls=new ArrayList<Integer>();
for(int i=0;i<arr.length;i++){
int value=arr[i];
if(value!=0){
ls.add(min+i);
}
}
return ls;
}
public static void main(String[] args){
int[] arr={-2,-1,3,5,7,9,30,4,-2,5,8,3};
Bit b=new Bit(arr);
System.out.print("排序后数组(有重复)为:");
for(int i:b.getSortedList()){
System.out.print(i+",");
}
System.out.println();
System.out.print("排序后数组(无重复)为:");
for(int i:b.getUniqueSortedList()){
System.out.print(i+",");
}
System.out.println();
String str=(b.hasDuplicateItem())?"有":"无";
System.out.println("数组arr"+str+"重复元素.");
int[] arr2={9,8,7,2};
str=(new Bit(arr2).hasDuplicateItem())?"有":"无";
System.out.println("数组arr2"+str+"重复元素.");
}
}
输出:
排序后数组(有重复)为:-2,-2,-1,3,3,4,5,5,7,8,9,30, 排序后数组(无重复)为:-2,-1,3,4,5,7,8,9,30, 数组arr有重复元素. 数组arr2无重复元素.
爪哇国新游记之二十二----排序判断重复时间复杂度为2n的位图法的更多相关文章
- 爪哇国新游记之二十九----访问URL获取输入流
代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...
- 爪哇国新游记之二十八----从url指定的地址下载文件到本地
package download; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; ...
- 爪哇国新游记之二----用于计算三角形面积的Point类和TAngle类
这次尝试用两个类完成一个面积计算任务: Point类代表平面上的点: public class Point { private float x; private float y; public Poi ...
- 爪哇国新游记之三十四----Dom4j的XPath操作
Dom4j是Java访问XML的利器之一,另一个是JDom.记得当年因为粗掌握点JDomAPI但项目要求使用Dom4j还闹一阵情绪,现在看来真是没必要,只花一些时间成本就进去一个新世界绝对是值得做的一 ...
- 爪哇国新游记之十四----初试JDBC
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- 爪哇国新游记之十九----使用Stack检查数字表达式中括号的匹配性
/** * 辅助类 * 用于记载字符和位置 * */ class CharPos{ char c; int pos; public CharPos(char c,int pos){ this.c=c; ...
- 爪哇国新游记之十三----XML文件读写
/** * XML读写示例 * @author hx * */ public class XmlReaderWriter{ /** * 读取一个XML文件,返回一个雇员链表 * @param file ...
- 爪哇国新游记之七----使用ArrayList统计水果出现次数
之前学习制作了DArray,了解ArrayList就容易了. /** * 用于存储水果名及数量 * */ public class Fruit{ private String name; public ...
- 爪哇国新游记之一----第一个类Cube
将这个类作为Java学习的第一个类,简单易懂易上手. /** * 正方体类 */ public class Cube { private int length;// 正方体边长 private sta ...
随机推荐
- [ Python - 5 ] 通过random模块生成随机字符串
import random checkcode = '' for i in range(4): if i == random.randint(0,3): current = chr(random.ra ...
- fullpage.js jq全屏滚动插件
fullPage.js和fullPage都能实现全屏滚动,二者区别是:fullPage.js需依赖于JQuery库,而fullPage不需要依赖任何一个js库,可以单独使用. (代码演示效果并且可以下 ...
- docker run 的背后的故事(zz)
当利用docker run来创建并启动容器的时候,docker后台标准的操作包括: 1.检查本地是否存在指定的镜像,不存在就从公有仓库下载. 当我依瓢画葫芦的运行: sudo docker run - ...
- opencv inrange 和 mix
opencv inrange: http://blog.csdn.net/xiaoyufei117122/article/details/53572904 http://blog.csdn.net/w ...
- mkdir 创建目录
短选项 长选项 含义 -m <目录属性> --mode <目录属性> 建立目录时同时设置目录的权限. -p --parents 此选项后,可以是一个路径名称.若路径中的某些目录 ...
- Linux下Tomcat安装配置
买了台阿里云服务器,因为配置比较低,所以用Linux系统,这里记录一下我在Linux系统中Tomcat的安装配置. 前提JDK已经安装好. 安装 首先在/usr/local/下建立一个tomcat的文 ...
- 【转】python 生成器和迭代器有这篇就够了
总结得特别好,转自:https://www.cnblogs.com/wj-1314/p/8490822.html 本节主要记录一下列表生成式,生成器和迭代器的知识点 列表生成器 首先举个例子 现在有个 ...
- 详解jQuery的选择器
1.基本选择器 基本选择器是jQuery中最常用的选择器,也是最简单的选择器,它通过元素id.class和标签名等来查找DOM对象.在网页中,每个id名称只能使用一次,class允许重复使用. ♠ # ...
- [BZOJ 3571] 画框
Link: BZOJ 3571 传送门 Solution: 和 BZOJ2395 的建模完全相同,(BZOJ2395 题解传送门) 仅仅是将其中的基础问题由最小生成树改成了二分图最大完美匹配 只要将原 ...
- 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings
论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...