• 爪哇国新游记之二十二----排序判断重复时间复杂度为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无重复元素.
  • 相关阅读:
    VMware Workstation Pro 12 创建虚拟机(安装Ubuntu)
    老师的题目(开心一刻)
    政务私有云盘系统建设的工具 – Mobox私有云盘
    学校信息化分享-中小学怎样快速完成教学资源库的建设
    SpringBoot 2.x 文件上传出现 The field file exceeds its maximum permitted size of 1048576 bytes
    nginx错误集
    nginx做http强制跳转https,接口的POST请求变成GET
    swagger Base URL地址和下边的不一致
    CentOS7关闭防火墙
    nginx配置:静态访问txt文件
  • 原文地址:https://www.cnblogs.com/heyang78/p/3878343.html
Copyright © 2020-2023  润新知