배열 조작 JavaScript 솔루션
17757 단어 arraysjavascripthackerrank
문제 설명
0의 1-인덱스 배열과 연산 목록으로 시작하여 각 연산에 대해 주어진 두 인덱스(포함) 사이의 각 배열 요소에 값을 추가합니다. 모든 작업이 수행되면 배열의 최대값을 반환합니다.
설정
작성 중인 함수는 두 개의 인수를 사용합니다. 첫 번째 인수 n은 작업을 수행하는 배열의 요소 수를 나타냅니다. 두 번째 인수인 쿼리는 배열에서 수행할 작업의 배열입니다. 쿼리의 각 요소는 시작 인덱스, 끝 인덱스 및 시작 인덱스와 끝 인덱스 사이의 배열 요소에 추가할 값으로 구성된 배열입니다.
예시
n = 12;
queries = [
// Start, end, value to add
[2, 7, 4],
[5, 9, 2],
[6, 12, 8]
]
/*
1 2 3 4 5 6 7 8 9 10 11 12 // Indices
*/
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] // Starting array
[0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0] // After queries[0]
[0, 4, 4, 4, 6, 6, 6, 2, 2, 0, 0, 0] // After queries[1]
[0, 4, 4, 4, 6, 14, 14, 10, 10, 8, 8, 8] // After queries[2]
largest = 10
순진한 접근 방식(무차별 대입)
function arrayManipulation(n, queries) {
let arr = new Array(n + 1).fill(0);
let max = 0;
queries.forEach(([a, b, k]) => {
for (let i = a; i <= b; i++) {
arr[i] += k;
if (arr[i] > max) {
max = arr[i];
}
}
})
return max
}
이제 이것은 일부 입력에 대해 작동합니다. 그러나 n이 큰 수일 때 어떤 일이 발생하는지 생각해 보십시오. 쿼리가 큰 배열인 경우 어떤 일이 발생하는지 생각해 보십시오. 쿼리의 각 작업에서 배열의 1-n 요소를 업데이트합니다. 수행할 작업이 많습니다. 따라서 솔루션으로 이와 같은 기능이 있는 경우 이 특정 문제에 대한 HackerRank의 일부 테스트가 시간 초과됩니다. 이 알고리즘을 사용하기에는 입력이 너무 큽니다. 웜프 웜프. 슬픈 트롬본.
하지만 뭔지 알아? 이 문제를 해결하는 방법을 모른다는 것은 부끄러운 일이 아닙니다. 어렵다고 표시되어 있습니다. 이 문제를 대규모로 해결하는 방법을 찾기 위해 토론 섹션에서 솔루션을 찾아야 했습니다. 그런 다음 제공된 솔루션이 어떻게 작동하는지 이해하기 위해 몇 가지 문제를 해결하기 위해 종이와 펜을 꺼내야 했습니다. 이것은 일단 이해하면 분명한 솔루션 중 하나입니다. 그리고 아름답습니다. 당연히 내가 찾은 솔루션은 모두 C++ 또는 Java로 되어 있었고 코드 문제에 대해 내가 선택한 언어가 아니므로 이를 JavaScript에 적용하여 이해했는지 확인하고 JavaScript로 해결하려는 사람이 더 쉽게 만들 수 있도록 했습니다. .
해결책
스포일러!
function arrayManipulation(n, queries) {
let arr = new Array(n + 1).fill(0);
queries.forEach(([a, b, k]) => {
arr[a - 1] += k;
arr[b] -= k;
})
let sum = 0;
let max = 0;
arr.forEach(val => {
sum += val;
max = Math.max(sum, max)
})
return max;
}
이전 예제를 사용하여 이것이 어떻게 작동하는지 살펴보겠습니다. arr[a - 1]에서 값을 변경하는 이유는 문제 문이 배열이 1-인덱싱됨을 나타내므로 JavaScript의 배열이 0-이기 때문에 주어진 배열 인덱스가 1만큼 꺼질 것이라고 표시했기 때문입니다. 인덱싱되었습니다. arr[b-1]이 아닌 arr[b]를 변경하는 이유는 작업이 에서 b까지 포함되어야 하기 때문입니다.
n = 12;
queries = [
// Start, end, value to add
[2, 7, 4],
[5, 9, 2],
[6, 12, 8]
]
/*
1 2 3 4 5 6 7 8 9 10 11 12 13 // Indices
*/
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] // Starting array
[0, 4, 0, 0, 0, 0, 0, -4, 0, 0, 0, 0, 0] // After [2,7,4]
[0, 4, 0, 0, 2, 0, 0, -4, 0, -2, 0, 0, 0] // After [5,9,2]
[0, 4, 0, 0, 2, 8, 0, -4, 0, -2, 0, 0, -8] // After [6,12,8]
sum = 0, max = 0, arr = [0,4,0,0,2,8,0,-4,0,-2,0,0,-8]
sum += 0; // sum stays 0, max stays 0
sum += 4; // sum is now 4, sum > max, so max becomes 4
sum += 0; // sum stays same, max stays same
sum += 0; // sum stays same, max stays same
sum += 2; // sum is now 6; sum > max, so max becomes 6;
sum += 8; // sum is now 14; sum > max, so max becomes 14;
sum += 0; // sum stays same, max stays same
sum += -4; // sum is 10; max > sum, so max stays 14;
sum += 0; // sum stays same, max stays same
sum += -2; // sum is 8; max > sum, so max stays 14;
sum += 0; // sum stays same, max stays same
sum += 0; // sum stays same, max stays same
sum += -8; // sum is 0; max > sum, so stays 14;
max = 14;
어떻게 작동합니까? 글쎄, 우리는 끝 인덱스 다음의 인덱스에서 k의 값을 빼기 때문에, 우리는 그 k를 추가했어야 하는 인덱스에 대해 주어진 k의 값만 더하는 것입니다. 그리고 작업의 시작과 끝을 표시하기 위해 배열의 값만 변경하기 때문에 각 쿼리에 대해 2개의 업데이트만 수행합니다. 최악의 경우 복잡도가 n인 변수 연산을 상수로 변경했습니다! 너무 초라하지 않습니다.
HackerRank에서 가져온 문제
Reference
이 문제에 관하여(배열 조작 JavaScript 솔루션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/amyshackles/array-manipulation-javascript-solution-58bj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)