移动距离不超过k的几乎有序的数组进行排序(堆最优解 时间复杂度N*O(K))

已知一个几乎有序的数组,把数组排好顺序的话,每个元素移动的距离一定不超过k,并且k相对于数组长度来说比较小

1.这道题如果我们不使用的k的条件,正常使用排序的算法,也是可以做的,只是复杂度过高,不是最优解;
2. 第一眼看到这个问题,感觉情况很多,有一种无从下手的感觉,其实从最简单情况,我们就会有一点思路,最简单的例子前k+1个元素,我们一定可以确定第一个位置的元素,这是因为移动距离不超过k,当我们确定第一个位置,考虑从[1,k+1]一定可以确定第二个位置的元素,依次类推
3.我们使用小根堆这种数据结构最为容器承载k+1个元素,很方便的获取堆中的元素

public void kOrder(int[] array,int k) {
   
		PriorityQueue<Integer> queue = new PriorityQueue<>();
		// 前k+1个元素进行入优先级队列
		//使用指针记录当前已经添加到优先级队列的位置
		int right = 0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值