第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;
}

 

posted @ 2021-09-22 20:45  现在开始努力  阅读(41)  评论(0)    收藏  举报