上次我们讲了堆和堆排序,这次我们来聊聊堆相关的话题。1.几乎有序数组排序1.题目描述已知一个几乎有序数组,几乎有序是指如果对数组进行排序,则每个元素的移动距离不得超过K,而K相对于数组长度而言是比较小的。请选择合适的排序策略对该数组进行排序。2、解决思路:从第一个数开始,将前K+1个数??放入小根堆,弹出第一个数,放到数组的第一个位置;将这个小根堆中的第K+2个数放到根堆中,弹出第一个数,放到数组的第二个位置;将第K+3个数放入小根堆,然后弹出第一个数,放入数组的第三个位置;直到小根堆为空3.详细参考代码:/***@authorJava与算法学习:星期一*/publicstaticvoidsortArrayDistanceLessK(int[]arr,intk){if(arr==null||arr.length<2||k==0){返回;}}//默认是一个小根堆PriorityQueueheap=newPriorityQueue<>();//标记当前放置在堆中的元素数组的下标ind0exint=;//将前k个数放入数组for(;index=1表示线段重合线段。2、解决思路1)将所有的线段按照起始位置从小到大排序,准备一个小根堆存放线段的结束位置。弹出起始位置的编号,同时将此时线段结束位置的编号放入小根堆中。此时小根桩的个数就是以此时线段的起始位置为重叠区域的左边界为重叠区域所包含的线段的个数。数字。(任何重叠区域的左边界一定是一条线段的左边界)因为此时小根桩中的数字表示之前的线段的右边界会穿过该线段的左边界在这次,而上一个线段的左边界小于这个线段的左边界,所以小根桩的个数就是重叠区域包含的线段个数。3)最后第2步中的最大数是包含线段最多的重叠区域包含的线段数3.详细参考代码:/***@authorJava与算法学习:星期一*/publicstaticclass行{Privateint开始;私人诠释结束;公共线路(intStart,intend){this.start=start;this.end=end;}/***时间复杂度o(n*logn)*/placestaticintlineCoverMaxByHeap(int[][]n){Line[]lines=newLine[n.length];对于(inti=0;io1.start-o2.start);//准备一个小的根堆(用来存放线段的结束值)PriorityQueueheap=newPriorityQueue<>();int覆盖=0;for(Lineline:lines){//O(N)/将/小根堆中所有小于等于当前线段起始值的数据弹出while(!heap.isEmpty()&&heap.peek()<=line.start){//O(logN)heap.poll();}}//改变当前段的将结束值放入小根堆heap.add(line.end);cover=Math.max(cover,heap.size());}返回封面;