百度笔试题:一个已经排序好的很大的数组,现在给它划分成m段,每段长度不定,段长最长为k,然后段内打乱顺序,请设计一个算法对其进行重新排序
来源:互联网 发布:唐朝 阿拉伯 知乎 编辑:程序博客网 时间:2024/05/16 08:33
- import java.util.Arrays;
- /**
- * 最早是在陈利人老师的微博看到这道题:
- * #面试题#An array with n elements which is K most sorted,就是每个element的初始位置和它最终的排序后的位置的距离不超过常数K
- * 设计一个排序算法。It should be faster than O(n*lgn)。
- *
- * 英文原题是:
- * Given an array of n elements, where each element is at most k away from its target position, devise an algorithm that sorts in O(n log k) time.
- * For example, let us consider k is 2, an element at index 7 in the sorted array, can be at indexes 5, 6, 7, 8, 9 in the given array.
- *
- * 微博里面的回复提到这道题的另一个表述:
- * @castomer:回复@华仔陶陶:今年百度校园招聘笔试题目我遇到了一道题和这个基本一样。“
- * 一个已经排序好的很大的数组,现在给它划分成m段,每段长度不定,段长最长为k,然后段内打乱顺序,请设计一个算法对其进行重新排序”
- *
- * 两种解法:
- * 1、插入排序,时间复杂度是O(n*k)
- * 由于“K most sorted”,寻找位置时最多只会寻找k位,因此复杂度从最坏情况的O(n*n)下降到O(n*k), 但插入排序没有充分利用“K most sorted”这个条件
- * 2、最小堆
- * @castomer 认为堆的大小是k
- * 这要看k most sorted怎么理解了
- * 例如,如果对于{4, 3, 2, 1}认为k=3,那么堆的大小就应该是4。因为如果取3的话,第一次最小堆{2, 3, 4}排序后取出最小值2,第二次最小堆排序后取出最小值1,2排在1前面,显然不合理
- *
- * 最小堆的时间复杂度是O(k) + (n-k) * O(lgk):
- * 建堆:O(k),k为堆的大小
- * 堆排序:(n-k) * O(lgk)
- *
- */
- public class KSortedArray {
- public static void main(String[] args) {
- int k = 3;
- int[] array = {2, 6, 3, 12, 56, 8};
- insertSort(array);
- minHeapSort(array, k);
- }
- public static void insertSort(int[] arrayToSort) {
- //...略去输入合法性检查
- //复制数组,不影响原数组
- int len = arrayToSort.length;
- int[] array = new int[len];
- System.arraycopy(arrayToSort, 0, array, 0, len);
- for (int i = 1; i < len; i++) {
- int itemToInsert = array[i];
- while(i > 0 && itemToInsert < array[i -1]) {
- array[i] = array[i - 1];
- i--;
- }
- array[i] = itemToInsert;
- }
- System.out.println(Arrays.toString(array));
- }
- 百度笔试题:一个已经排序好的很大的数组,现在给它划分成m段,每段长度不定,段长最长为k,然后段内打乱顺序,请设计一个算法对其进行重新排序
- 把一个长度为n的数组分成k段,让每段和的最大值最小。
- 假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」
- 给定一个正整数n,将其分成m段,每段为n1,n2,...,nm,求怎么划分使得n1*n2*...*nm最大
- 一个 SQL 分段排序的问题(也可以理解为 段内汇总排序问题)
- 已知m和n是已经排序好的数组,从小到大,现在要合并这两个数组内的数到一个数组,仍然要求是从小到大排序
- 已知m和n是已经排序好的数组,从小到大,现在要合并这两个数组内的数到一个数组,仍然要求是从小到大排序
- 已知m和n是已经排序好的数组,从小到大,现在要合并这两个数组内的数到一个数组,仍然要求是从小到大排序
- CF484D 把数组划分成几段,求所有段的最大值-最小值之和的最大值
- Linux文件权限一共10位长度,分成四段,每段的含义
- LeetCode(Palindrome partition 2) 求将一个字符串划分成回文子串 需要分成的段数最少是多少
- C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为根据第二段长度补齐第一段
- google校招笔试题 2.2 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序。
- 有n个连续的整数,这些正数有正有负. 请取出这段整数的一个子段,其和为所有字段中最大.
- 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 给定一个int数组A,同时给定
- 段界限是指的段内最大偏移值,第1个字节偏移为0,最后一个则偏移为长度-1了。
- HDU 1024 给定一个数组,求其分成m个不相交子段和最大值
- 一个成熟的 多字段 排序 分页 存储过程
- iPhone4平台上实时音视频对话(经验)
- 开源 免费 java CMS - FreeCMS-功能说明-角色管理 .
- Java Channel解析与实例
- java设计模式——迭代器模式
- java 垃圾回收相关总结 【思维导图】
- 百度笔试题:一个已经排序好的很大的数组,现在给它划分成m段,每段长度不定,段长最长为k,然后段内打乱顺序,请设计一个算法对其进行重新排序
- 命名规则
- Android之UI学习篇十二:ListView控件学习(二)
- java 类的初始化1
- 《高质量程序设计指南——C/C++》第14章 C++函数的高级特性
- cmyk图片转为rgb图片
- EditPlus中配置java命令工具
- Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式
- Java 并发:Executors 和线程池