第3天--算法(把数组排成最小的数,最小的k个数)
把数组排成最小的数:
public String PrintMinNumber(int [] numbers) {
String str[] = new String[numbers.length];
for(int i = 0;i < numbers.length;i ++){ //先将int数组转换为String数组
str[i] = String.valueOf(numbers[i]);
}
Arrays.sort(str,(o1,o2) -> ((o1 + o2).compareTo(o2 + o1))); //将String数组进行排序
StringBuilder sb = new StringBuilder();
for(int i = 0;i < numbers.length;i ++){
sb.append(str[i]);
}
return sb.toString();
}
最小的k个数:
方法1:最小堆
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
Queue<Integer> queue = new PriorityQueue<>((o1,o2) -> (o2.compareTo(o1))); //构建最小堆
for(int i = 0;i < input.length;i ++){ //将数组中的每一个元素进行入堆,超过指定个数k,则进行poll操作
queue.add(input[i]);
if(queue.size() > k){
queue.poll();
}
}
ArrayList<Integer> ls = new ArrayList<>(); //将堆中元素出堆并加入ArrayList中
for(int i = 0;i < k;i ++){
ls.add(queue.poll());
}
return ls;
}
方法2:二分+快排partition
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
if(input == null || input.length == 0){
return new ArrayList();
}
int low = 0;
int high = input.length - 1;
while(low < high){
int index = partition(input,low,high);
if(index == k - 1){
break;
}else if(index < k - 1){
low = index + 1;
}else{
high = index - 1;
}
}
ArrayList<Integer> ls = new ArrayList<>();
for(int i = 0;i < k;i ++){
ls.add(input[i]);
}
return ls;
}
public int partition(int arr[],int low,int high){ //partition函数返回index值,该index值之前的元素均小于该index值位置的元素,该index值之后的元素均大于该index值位置的元素
int pivot = arr[low];
int index = low;
for(int i = low;i <= high;i ++){
if(arr[i] < pivot){
swap(arr,i,++index);
}
}
swap(arr,low,index);
return index;
}
public void swap(int arr[],int i,int j){ //swap函数交换数组中两个元素的位置
int temp;
temp = arr[i];
arr[i] =arr[j];
arr[j] = temp;
}

浙公网安备 33010602011771号