116 lines
2.1 KiB
JavaScript
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
|
|
}
|