Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 常数空间中排序算法的求解_Java_Algorithm - Fatal编程技术网

Java 常数空间中排序算法的求解

Java 常数空间中排序算法的求解,java,algorithm,Java,Algorithm,我试图解决以下问题: 给定一个只有3个唯一数字(1、2、3)的数字数组,在O(n)时间内对列表进行排序 例1: 输入:[3,3,2,1,3,2,1] 输出:[1,1,2,2,3,3,3] 挑战:尝试使用常量空间对列表进行排序 我可以使用额外空间的第一部分很简单,基本上我所做的是找到最小值、最大值和中间值,将它们作为键存储在hashmap中,并将它们的频率作为hashmap值,然后用正确的值填充新创建的数组: import java.util.Map; import java.util.HashM

我试图解决以下问题:

给定一个只有3个唯一数字(1、2、3)的数字数组,在O(n)时间内对列表进行排序

例1:

输入:[3,3,2,1,3,2,1]

输出:[1,1,2,2,3,3,3]

挑战:尝试使用常量空间对列表进行排序

我可以使用额外空间的第一部分很简单,基本上我所做的是找到最小值、最大值和中间值,将它们作为键存储在
hashmap
中,并将它们的频率作为
hashmap
值,然后用正确的值填充新创建的数组:

import java.util.Map;
import java.util.HashMap;
class Testing{

    public static void sortArr(int[] arr){
        int[] newArr=new int[arr.length];
        Map<Integer,Integer> hm=new HashMap<Integer,Integer>(3);
        int mini=minArr(arr);
        int maxi=maxArr(arr);
        int midNum=Integer.MAX_VALUE;
        
        for(int num : arr){
            if(hm.containsKey(num)){
                hm.put(num,hm.get(num)+1);
            }else{hm.put(num,1);}
        }

        for(int num : hm.keySet()){
            if(num!=mini && num!=maxi){
                midNum=num;
                break;
            }
        }

        for(int i=0;i<arr.length;++i){
            if(i<hm.get(mini)){
                newArr[i]=mini;
            }else if(i>(arr.length-hm.get(maxi))){
                newArr[i]=maxi;
            }else{
                newArr[i]=midNum;
            }
        }

        for(int num : newArr){
            System.out.println(num);
        }
    }

    public static int minArr(int[] arr){
        int mini=Integer.MAX_VALUE;
        for(int num : arr){
            if(num<mini){
                mini=num;
            }
        }
        return mini;
    }

    public static int maxArr(int[] arr){
        int maxi=Integer.MIN_VALUE;
        for(int num : arr){
            if(num>maxi){
                maxi=num;
            }
        }
        return maxi;
    }


    public static void main(String args[]){
        int[] arr={-4,-4,9,9,-4,3,9,3,3,3,3,9,9,-4,9,3};
        sortArr(arr);
    }
}
import java.util.Map;
导入java.util.HashMap;
类测试{
公共静态无效排序器(int[]arr){
int[]newArr=新int[arr.length];
Map hm=新的HashMap(3);
int mini=minArr(arr);
int maxi=maxArr(arr);
int midNum=整数的最大值;
for(int num:arr){
如果(hm.containsKey(num)){
hm.put(num,hm.get(num)+1);
}else{hm.put(num,1);}
}
for(int num:hm.keySet()){
如果(num!=mini&&num!=maxi){
midNum=num;
打破
}
}

对于(inti=0;i,如果只需要最终结果,可以使用三个计数器

  • 数一数列表中的1、2和3
  • 然后使用循环,从列表的第一个开始,用找到的计数数字写出数字
  • 例如,您有2
    1
    、2
    2
    和3
    3
    。然后在数组上循环,根据每个数字的计数器值从数组的第一个开始写入这些数字


    额外的空间是三个变量,这是一个常数空间。同时,时间复杂度是
    Theta(n)
    当我们在数组中循环两次时。

    您的贴图占用恒定的空间,因此您只需删除输出数组。您可以更新输入数组。顺便说一句,您可以使用长度为3的数组而不是贴图来计算频率,从而使代码更简单。(不确定这是否是最好的复制品。实际上,这是Dijkstra的一个经典问题:)@Eran你说得对,谢谢,伙计,我不知道为什么我想不起来:/