题解

该题聚焦点为如何高效的对移动窗口内数据进行排序,当窗口已经有序的时候,向右移动一格,需要把新加入的数据替换掉该剔除的数据,此时就变成一个有序数组里有一个数是乱序的,此时只要将这一个乱序数进行插入排序即可。总的时间复杂度为 n*O(n)

代码

  1. var medianSlidingWindow = function(nums, k) {
  2. // 记录结果
  3. let ret = []
  4. // 窗口数组
  5. let arr = nums.slice(0, k)
  6. // 首次进行快排
  7. quickSort(arr)
  8. // 放入第一个中位数
  9. ret.push(calcMid(arr))
  10. // 遍历原数组
  11. for (let i = 1; i <= nums.length - k; i++) {
  12. binarySearchSort(arr, nums[i-1], nums[i-1+k])
  13. ret.push(calcMid(arr))
  14. }
  15. return ret
  16. };
  17. function calcMid(arr) {
  18. let sum = arr.length - 1
  19. if (sum % 2 === 0) {
  20. return arr[sum/2]
  21. } else {
  22. let mid = Math.floor(sum/2)
  23. return (arr[mid] + arr[mid + 1]) / 2
  24. }
  25. }
  26. function quickSort(arr) {
  27. arr.sort((a, b) => a - b)
  28. }
  29. function binarySearchSort(arr, remove, add) {
  30. // 使用 add 替换 remove 并返回 remove 所在位置
  31. let index = binarySearchReplace(arr, remove, add)
  32. // 重新排序,从 index 位置进行一次插入排序
  33. insertSortFromIndex(arr, index)
  34. }
  35. function insertSortFromIndex(arr, index) {
  36. let flag = false
  37. while (index >= 1 && arr[index - 1] > arr[index]) {
  38. [arr[index - 1], arr[index]] = [arr[index], arr[index - 1]]
  39. index--
  40. flag = true
  41. }
  42. if (flag) return
  43. while (index < arr.length - 1 && arr[index + 1] < arr[index]) {
  44. [arr[index + 1], arr[index]] = [arr[index], arr[index + 1]]
  45. index++
  46. }
  47. }
  48. function binarySearchReplace(arr, remove, add) {
  49. let index = binarySearch(arr, remove, 0, arr.length - 1)
  50. arr[index] = add
  51. return index
  52. }
  53. function binarySearch(arr, target, start, end) {
  54. if (start <= end) {
  55. let mid = Math.floor((start + end) / 2)
  56. if (arr[mid] === target) {
  57. return mid
  58. } else if (arr[mid] < target) {
  59. start = mid + 1
  60. return binarySearch(arr, target, start, end)
  61. } else {
  62. end = mid - 1
  63. return binarySearch(arr, target, start, end)
  64. }
  65. } else {
  66. return -1
  67. }
  68. }