js-practice/src/array/maximum-gap.js

116 lines
2.1 KiB
JavaScript

// LeetCode 164. 最大间距 https://leetcode-cn.com/problems/maximum-gap/
// LintCode 400. 最大间距 https://www.lintcode.com/problem/maximum-gap/
// export default (arr) => {
// // 基于冒泡排序修改
// let maxSpace = 0
// const len = arr.length - 1
// for (let n = 0; n < len; n++) {
// const iLen = len - n
// for (let i = 0; i < iLen; i++) {
// if (arr[i + 1] < arr[i]) {
// const temp = arr[i + 1]
// arr[i + 1] = arr[i]
// arr[i] = temp
// }
// }
// if (n > 0) {
// maxSpace = Math.max(arr[iLen + 1] - arr[iLen], maxSpace)
// }
// }
// return len > 0 ? Math.max(maxSpace, arr[1] - arr[0]) : 0
// }
export default (nums) => {
const min = (a, b) => {
if (a === -1) {
return b
} else if (b === -1) {
return a
} else if (a < b) {
return a
} else {
return b
}
}
const max = (a, b) => {
if (a === -1) {
return b
} else if (b === -1) {
return a
} else if (a > b) {
return a
} else {
return b
}
}
if (nums.length < 2) {
return 0
}
let minNum = -1
let maxNum = -1
const n = nums.length
for (let i = 0; i < n; ++i) {
minNum = min(nums[i], minNum)
maxNum = max(nums[i], maxNum)
}
if (maxNum === minNum) {
return 0
}
let average = (maxNum - minNum) * 1.0 / (n - 1)
if (average === 0) {
++average
}
const localMin = (s) => {
const a = []
while (s-- > 0) {
a.push(0)
}
return a
}
const localMax = (s) => {
const a = []
while (s-- > 0) {
a.push(0)
}
return a
}
for (let i = 0; i < n; ++i) {
localMin[i] = -1
localMax[i] = -1
}
for (let i = 0; i < n; ++i) {
const t = (((nums[i] - minNum) / average) | 0)
localMin[t] = min(localMin[t], nums[i])
localMax[t] = max(localMax[t], nums[i])
}
let ans = (average | 0)
let left = 0
let right = 1
while ((left < n - 1)) {
while ((right < n && localMin[right] === -1)) {
++right
}
if (right >= n) {
break
}
ans = max(ans, localMin[right] - localMax[left])
left = right
++right
}
return ans
}