jscoding
Version:
A envirement for coding and debugging javascript language.
69 lines (66 loc) • 2.45 kB
JavaScript
// ------- 以下是算法题目常用到的 util 函数,可以在 main 中直接使用 ---------
/**
* 请注意: upperBound 接受一个升序的数组
* @method upperBound
* @param {Array} arr 要进行查找的数组
* @param {Number} left 要查找区间的起始位置
* @param {Number} right 要查找区间的结束位置
* @param {Number, String} key 给定用来查找的值
* @param {Function} cmp 扩展函数,可通过 cmp 函数实现对复杂数据结构的二分查找
* @returns {Number} 数组的索引
* @desc 可参考 C++ STL upperBound, 查找有序区间中第一个小于或等于某给定值的元素的位置, 时间复杂度 O(logN)
*/
export function upperBound(arr, left, right, key, cmp = param => param) {
let mid;
while (right > left) {
mid = Math.floor((left + right) / 2);
if (cmp(arr[mid]) >= key) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return cmp(arr[left]) > key ? left - 1 : left;
}
/**
* 请注意: lowerBound 接受一个升序的数组
* @method lowerBound
* @param {Array} arr 要进行查找的数组
* @param {Number} left 要查找区间的起始位置
* @param {Number} right 要查找区间的结束位置
* @param {Number, String} key 给定用来查找的值
* @param {Function} cmp 扩展函数,可通过 cmp 函数实现对复杂数据结构的二分查找
* @returns {Number} 数组的索引
* @desc 可参考 C++ STL lower_bound, 查找有序区间中第一个大于或等于某给定值的元素的位置, 时间复杂度 O(logN)
*/
export function lowerBound(arr, left, right, key, cmp = param => param) {
let mid;
while (right > left) {
mid = Math.floor((left + right) / 2);
if (cmp(arr[mid]) > key) {
right = mid - 1;
} else {
left = mid + 1;
}
}
if (left === right && cmp(arr[mid]) === key) right -= 1;
return cmp(arr[right]) < key ? right + 1 : right;
}
/**
* 分解质因子,如:180 ==> 2 2 3 3 5
*/
function splitPrimeFactor(n) {
let factors = [];
for (let i = 2; i <= n; i++) {
if (!(n % i)) {
n = n / i;
factors.push(i);
i = 1;
}
}
// 升序
let result = factors.sort(function(a, b) {
return a - b;
}).join(' ') + ' ';
print(result);
}