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无重复元素.
  • 相关阅读:
    C# 二维码 ThoughtWorks.QRCode.dll
    Asp.net生命周期
    进程和线程,多线程等使用方法
    反射的使用与定义
    《委托和事件》
    《泛型集合》
    第三课时《枚举》
    数据库字段包括数组中的每一项
    .NetCore 图片压缩
    NetCore3.0 EF修改
  • 原文地址:https://www.cnblogs.com/heyang78/p/3878343.html
Copyright © 2011-2022 走看看