Показать сообщение отдельно
  #79 (permalink)  
Старый 05.08.2018, 06:25
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

function smaller(arr) {
	var n = arr.length, node = null, result, newArr = new Array(n);
	function addTo(node, value, smallerCount){
		if(node === null) { //старт
			node = { value: value, lowerCount: 0, count: 1, left: null, right: null }; 
			result = smallerCount;
		}
		else if(node.value === value){ // баланс 
			node.count++;
			result = smallerCount + node.lowerCount;
		}
		else if(value < node.value){ 
			node.lowerCount++;
			node.left = addTo(node.left, value, smallerCount);
			// дублирующее количество правых +1
		}
		else node.right = addTo(node.right, value, smallerCount + node.count + node.lowerCount); // количество меньших чисел
		return node;
	}
	for(var i = n-1; i >= 0; i--) {
		node = addTo(node, arr[i], 0);
		newArr[i] = result;
	}
	return newArr;
}


лучше шестерки под чаек решать, чем так загоняться

Последний раз редактировалось j0hnik, 08.08.2018 в 02:54.
Ответить с цитированием