一道有意思的面试题,记录下
一个数组[1,0,1],将他看做柱状图,那么就可以接水1,
一个数组[2,0,3],将他看做柱状图,那么就可以接水2。
求一个统计节水量的方法。
一.暴力法
function demo(arr=[]) {
if(Array.isArray(arr) && arr.length > 2) {
let sum = 0
let len = arr.length
for(let i = 1; i < len - 1; i ++) {
let cur = arr[i]
let leftMax = 0
let rightMax = 0
for(let j = i; j < len; j ++) {
rightMax = Math.max(arr[j], rightMax)
}
for(let j = i; j >= 0; j --) {
leftMax = Math.max(arr[j], leftMax)
}
sum += (Math.min(leftMax, rightMax) - cur)
}
return sum
}else {
return 0
}
}
二.暴力法简化版
function demo(arr=[]) {
if(Array.isArray(arr) && arr.length > 2) {
let sum = 0
let len = arr.length
for(let i = 1; i < len - 1; i ++) {
let cur = arr[i]
let leftMax = Math.max(...arr.slice(0, i + 1))
let rightMax = Math.max(...arr.slice(i))
sum += (Math.min(rightMax, leftMax) - cur)
}
return sum
}else {
return 0
}
}
三.双指针法
function demo(arr = []) {
if (Array.isArray(arr) && arr.length > 2) {
let [sum, len] = [0, arr.length]
let [leftIndex, rightIndex] = [0, len - 1]
let [leftMax, rightMax] = [arr[leftIndex], arr[rightIndex]]
while (leftIndex < rightIndex) {
leftMax = Math.max(leftMax, arr[leftIndex])
rightMax = Math.max(rightMax, arr[rightIndex])
if (leftMax < rightMax) {
sum += (leftMax - arr[leftIndex])
leftIndex++
} else {
sum += (rightMax - arr[rightIndex])
rightIndex--
}
}
return sum
} else {
return 0
}
}