zoukankan      html  css  js  c++  java
  • 爪哇国新游记之二十二----排序判断重复时间复杂度为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无重复元素.
  • 相关阅读:
    手机传感器大科普:手机中的陀螺仪、加速器和磁力计
    安卓新导入工程中gen目录下无R文件解决方法
    自写的 c# 锚点,前端显示 读书 记事本(一)
    update access 不能更新
    NHibenate初学资源推荐(切肤之痛)
    ASP.NET页面刷新和定时跳转
    c#(或vb.net)程序改进 (转载)
    感恩节的一天
    了解自己以及明白牛人会找什么样的人创业
    从别人如何读简历 看我们该如何成长
  • 原文地址:https://www.cnblogs.com/heyang78/p/3878343.html
Copyright © 2011-2022 走看看