题目描述:
对于每一个元素,从第一个元素到该元素为止的若干个元素,进行升序排序,得到该元素在排序中的下标。 即对于每一个元素,得出其前面有几个比它小的元素。
方法一:O(n^2)
将前面的每一个元素和当前元素进行比较,统计有几个比它小的元素。
// O(n^2)
function numIndex(nums) {
const length = nums.length;
const res = [];
res.push(0);
let time = 0;
for (let i = 1; i < length; i++) {
for (let j = 0; j < i; j++) {
if (nums[j] < nums[i])
time++;
}
res.push(time);
time = 0;
}
return res;
}
方法二:O(n logn)
构建一个搜索二叉树,节点存储下元素的值和其左子树上的节点个数。那么对于数组中的每一个元素,在遍历二叉树给其确定插入位置的过程中,就能得出有几个比它小的元素。二叉树遍历的时间复杂度是O(log n)。
// 二叉树结点
function TreeNode(val, leftNum, left, right) {
this.val = (val === undefined ? 0 : val)
this.leftNum = (leftNum === undefined ? 0 : leftNum)
this.left = (left === undefined ? null : left)
this.right = (right === undefined ? null : right)
}
// O(n logn)
function numIndex1(nums) {
const length = nums.length;
const root = new TreeNode(nums[0], 0);
const res = [0];
for (let i = 1; i < length; i++) {
// 构建搜索二叉树,节点存储其左子树上的元素个数
let p = root;
let time = 0;
while (p) {
if (nums[i] < p.val) {
p.leftNum++;
if (p.left == null) {
p.left = new TreeNode(nums[i], 0);
res.push(time);
break;
}
else
p = p.left;
}
else{
if(nums[i]===p.val)
time+=p.leftNum;
else
time+=p.leftNum+1;
if(p.right==null){
p.right=new TreeNode(nums[i],0);
res.push(time);
break;
}
else
p=p.right;
}
}
}
return res;
}