java算法常用

PriorityQueue

与普通队列不同,优先队列元素是按排序顺序检索的。

假设我们想以升序检索元素。在这种情况下,优先队列的头是最小的元素。检索到该元素后,下一个最小的元素将成为队列的头。

PriorityQueue<Integer> numbers = new PriorityQueue<>();

这里,我们创建了一个没有任何参数的优先级队列。**在这种情况下,优先级队列的头是队列中最小的元素。**元素将按升序从队列中移除。

comparator

 import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
public static void main(String[] args) {

//创建优先级队列
PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
numbers.add(4);
numbers.add(2);
numbers.add(1);
numbers.add(3);
System.out.print("PriorityQueue: " + numbers);
}
}

class CustomComparator implements Comparator<Integer> {

@Override
public int compare(Integer number1, Integer number2) {
int value = number1.compareTo(number2);
//元素以相反的顺序排序
if (value > 0) {
return -1;
}
else if (value < 0) {
return 1;
}
else {
return 0;
}
}
}

在以上所有示例中,优先级队列元素都是按自然顺序(升序)检索的。 但是,我们可以自定义此顺序。

为此,我们需要创建自己的comparator类,它实现了Comparator接口。

如果你是直接想创建大顶堆,就是直接比较存入的数据的大小,那么这样写就行,大顶堆就是后面减前面的

PriorityQueue<Integer>pq=new PriorityQueue<>((o1,o2)->o2.compareTo(o1));

如果你想以别的,比如这个key在map里对应的value的大小,然后建立大顶堆,那么应该重写compare

PriorityQueue<Integer>pq=new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer a,Integer b)
{
return map.get(b)-map.get(a);
}
});

List<int[]>

刷力扣遇到了这种用法,

List<int[]> list = new ArrayList<int[]>(); 
list.add(new int[]{1,2,3});
list.add(new int[]{4,5});

是一个列表,其中每个元素都是一个int类型的数组,这个列表可以用来存储一组整数数组,每个数组可以有不同的长度和元素。

转成int[][][][][][][] [],因为有的傻逼题目会要你写成int [] [] 返回

list.toArray(new int[list.size()][]);

Arrays.asList()

把数组转成List

String[] myArray = { "Apple", "Banana", "Orange" }; 
List<String> myList = Arrays.asList(myArray);
//上面两个语句等价于下面一条语句
List<String> myList = Arrays.asList("Apple","Banana", "Orange");

Arrays.sort

重写排序规则

Arrays.sort(nums,new Comparator<String>(){
public int compare(String s1,String s2)
{
return (s1+s2).compareTo(s2+s1);//升序就是前面比后面
}
});

用到了的题目:把数组排成最小的数_牛客题霸_牛客网 (nowcoder.com)


← Posts