Java 常数空间中排序算法的求解
我试图解决以下问题: 给定一个只有3个唯一数字(1、2、3)的数字数组,在O(n)时间内对列表进行排序 例1: 输入:[3,3,2,1,3,2,1] 输出:[1,1,2,2,3,3,3] 挑战:尝试使用常量空间对列表进行排序 我可以使用额外空间的第一部分很简单,基本上我所做的是找到最小值、最大值和中间值,将它们作为键存储在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
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
然后使用循环,从列表的第一个开始,用找到的计数数字写出数字
例如,您有21
、22
和33
。然后在数组上循环,根据每个数字的计数器值从数组的第一个开始写入这些数字
额外的空间是三个变量,这是一个常数空间。同时,时间复杂度是Theta(n)
当我们在数组中循环两次时。您的贴图占用恒定的空间,因此您只需删除输出数组。您可以更新输入数组。顺便说一句,您可以使用长度为3的数组而不是贴图来计算频率,从而使代码更简单。(不确定这是否是最好的复制品。实际上,这是Dijkstra的一个经典问题:)@Eran你说得对,谢谢,伙计,我不知道为什么我想不起来:/