@You7431

Как остановить бесконечный цикл в for который запускается с некоторыми значениями?

function addWheat(blocks) {

  if (blocks.length > 2 && blocks.length !== 3) {

    let totalNumber = 0;

    for(let i = 0; i < blocks.length; i++){
      for(let z = 0; z < blocks.length; z++){
        if (blocks[i] > blocks[z]) {
          totalNumber += blocks[i] - blocks[z]
        }
        else {
          i = z
        }
      }
    }
      return totalNumber
  }

    if (blocks.length === 3) {
      if (blocks[0] > blocks[1] && blocks[1] < blocks[2]) {
        const firstMinValue = Math.min(...blocks);
        const indexMinValue = blocks.indexOf(firstMinValue);
    
        blocks.splice(indexMinValue, 1);
    
        const secondMinValue = Math.min(...blocks);
        const result = secondMinValue - firstMinValue;
        
        return result
      }
    }
  return 0
}


console.log(addWheat([4, 1, 3])) // 2
console.log(addWheat([2, 1, 5, 2, 7, 4, 10])) // 7
console.log(addWheat([2, 0, 1, 5, 2, 7])) // 6
console.log(addWheat([2, 4, 2]))// 0
console.log(addWheat([7, 4])) // 0
console.log(addWheat([])) // 0

Тесты работают но если поставить значения, допустим [2, 1, 5, 2, 7, 4, 10, 10] или [15,9,6,10,11,2,5] то программа попадает в infinity loop, что делать?

Я решаю задачу где каждый элемент массива равен одному блоку контейнера, нужно посчитать сколько зерна влезет между блоками, нужно что бы оно не высыпалось:631afdb2c56de355311760.jpeg

Думал ставить break но не знаю как правильно или делать проверку:
if (levels.length - 1 < levels.length - 2) Но она не работает для всех вариантов когда появляется infinity loop
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
у тебя слишком много вложенных циклов, комп не справляется )

вот, за линейное время
function addWheat(blocks) {
    let leftPos = 0;
    let rightPos = blocks.length - 1;
    let leftMax = -Infinity;
    let rightMax = -Infinity;
    let sum = 0;

    while (leftPos < rightPos) {
        const leftValue = blocks[leftPos];
        const rigthValue = blocks[rightPos];
        
        if (leftValue < rigthValue) {
            leftMax = Math.max(leftMax, leftValue);
            sum += leftMax - leftValue;
            leftPos++;
        } else {
            rightMax = Math.max(rightMax, rigthValue);
            sum += rightMax - rigthValue;
            rightPos--;
        }
    }

    return sum;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы