堆相关例子-排序最多移动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();
        }

    }
相关推荐
一杯奶茶¥6 分钟前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
不能只会打代码9 分钟前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛
小刘|10 分钟前
Spring AI Alibaba 集成和风天气 API 实战
java·服务器·前端
KANGBboy13 分钟前
java知识五(继承)
java·开发语言
AI人工智能+电脑小能手17 分钟前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试
DIY源码阁20 分钟前
JavaSwing饮品管理系统 - MySQL版
java·数据库·mysql·eclipse
开源Z21 分钟前
LeetCode 42 · 接雨水:从暴力到双指针的三步优化
算法·leetcode
旖-旎30 分钟前
《LeetCode 695 岛屿的最大面积 FloodFill DFS 解法》
c++·算法·力扣·深度优先遍历·floodfill
影视飓风TIM44 分钟前
数据结构 | 链表超全笔记(单链表+双链表+高频算法题)
数据结构·笔记·链表
二哈赛车手1 小时前
新人笔记---最终版智能体图片分析完整方案,包括一些总结于经验,以及各种优化点讲解
java·笔记·spring·ai·springboot