1. 最小的k个数
堆
大根堆就是根节点比左右孩子都要大或者等于的二叉树,小根堆就是根节点比左右孩子都要小或者等于的二叉树
将前k个数插入大根堆,从第k+1个数开始遍历,如果比大根堆堆顶小,把堆顶的数弹出,插入当前数。
import java.util.*;
class Solution{
public int[] getLeastNumbers(int[] arr,int k){
int[] vec=new int[k];
if(k==0){
return vec;
}
PriorityQueue<Integer> queue=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
for(int i=0;i<k;i++){
queue.offer(arr[i]);
}
for(int i=k;i<arr.length;i++){
if(queue.peek()>arr[i]){
queue.poll();
queue.offer(arr[i]);
}
}
for(int i=0;i<k;i++){
vec[i]=queue.poll();
}
return vec;
}
}
快排思想
**
import java.util.*;
class Solution{
public static int[] getLeastNumber(int[] arr,int k){
if(k>=arr.length) return arr;
return quickSort(arr,k,0,arr.length-1);
}
private static int[] quickSort(int[] arr,int k,int l,int r){
int i=l,j=r,val=arr[l];
while(i<j){
while(i<j && arr[j]>val) j--;
if(i<j)
arr[i++]=arr[j];
while(i<j&& arr[i]<val)i++;
if(i<j)
arr[j--]=arr[i];
}
arr[i]=val;
if(i>k) return quickSort(arr,k,l,i-1);
if(i<k) return quickSort(arr,k,i+1,r);
return Arrays.copyOf(arr,k);
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int k=2;
int a[] = {1,2,6,8,5,4};
getLeastNumber(a,2);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
}
**
类实现Comparable接口(重写compareTo()方法),或提供Comparator接口(重写compare()方法)
import java.util.*;
class Solution{
public static void main(String[] args) {
String[] str = new String[5];
str[0]="3";
str[1]="1";
str[2]="2";
str[3]="5";
str[4]="4";
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2)<0?1:0;
}
});
Arrays.sort(str);//不加不排序
for (int i = 0; i < str.length ; i++) {
System.out.println(str[i]);
}
}
}
实现Comparable接口(重写compareTo()方法)
public class Test {
public static void main(String[] args) {
Student stu1 = new Student("hubert",20);
Student stu2 = new Student("jake",18);
System.out.println(stu1.compareTo(stu2));//结果为1
}
}
class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student o) {
return this.age<o.age?-1:this.age==o.age?0:1;
}
}
提供Comparator接口(重写compare()方法)
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
Student stu1 = new Student("hubert",20);
Student stu2 = new Student("jake",18);
int compare = new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() < o2.getAge() ? -1 : o1.getAge() == o2.getAge() ? 0 : 1;
}
}.compare(stu1, stu2);
System.out.println(compare);
}
}
class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
}
2、将两个无序链表合并成一个有序链表并返回
3、力扣1079
4、钻石
5、字符串瘦身
6、两个数组之间的距离