堆相关例子-排序最多移动k距离

题目:

一个几乎有序的数组。几乎有序是指:如果把数组排好序,每个数的移动距离一定不超过K,并且K一定远小于数组长度

分析:

给定的数组有上面的限制条件,根据条件可以分析得到:

对于前0-k个数如果排好序了,那么0位置一定是最小数,因为k位置后面的数无法移动到0位置

所以建立一个小根堆,大小为k+1,用于放置0-k的数

当堆满时,弹出堆顶,此时堆顶是当前需要排序的数列最小值,再将后续一个数入堆

后续数进来,弹出堆顶,再入堆

图解

code

java 复制代码
public static void sortArrayDistanceLessK(int [] arr,int k){
        if(k==0)return;

        //小根堆,大小为k+1
        //将数组前k+1个数入堆
        int heapSize = Math.min(arr.length,k+1);
        PriorityQueue<Integer> minHeap = new PriorityQueue();
        int i = 0;
        for (; i < heapSize; i++) {
            minHeap.add(arr[i]);
        }

        int sortIndex = 0;
        //弹出堆顶,新加入堆
        for(;i<arr.length;i++){
            arr[sortIndex++] = minHeap.poll();
            minHeap.add(arr[i]);
        }
        while (!minHeap.isEmpty()){
            arr[sortIndex++] = minHeap.poll();
        }

    }
相关推荐
论迹4 分钟前
【JavaEE】-- 多线程(初阶)2
java·开发语言·java-ee
桃子是唯一的水果13 分钟前
java 单例模式(Lazy Initialization)实现遍历文件夹下所有excel文件且返回其运行时间
java·单例模式·maven
+72014 分钟前
如何在java中用httpclient实现rpc post 请求
java·开发语言·rpc
ybq1951334543116 分钟前
javaEE-SpringBoot日志
java·spring boot·后端
火烧屁屁啦20 分钟前
【JavaEE进阶】图书管理系统 - 贰
java·spring
xzzd_jokelin20 分钟前
Spring AI 接入 DeepSeek:开启智能应用的新篇章
java·人工智能·spring·ai·大模型·rag·deepseek
web_1553427465622 分钟前
性能巅峰对决:Rust vs C++ —— 速度、安全与权衡的艺术
c++·算法·rust
刘什么洋啊Zz31 分钟前
剖析IO原理和零拷贝机制
java·运维·网络
卷心菜好6啊39 分钟前
特辣的海藻!2
java
心态与习惯41 分钟前
mac 下 java 调用 gurobi 不能加载 jar
java·jar·mac·cplex·gurobi