1703. JAVA의 Leetcode 솔루션
2612 단어 java
class Solution {
public int minMoves(int[] nums, int k) {
if (k == 1)
return 0;
List<Integer> indices = new ArrayList<Integer>();
int length = nums.length;
for (int i = 0; i < length; i++) {
if (nums[i] == 1)
indices.add(i);
}
int ones = indices.size();
int differencesCount = ones - 1;
int[] differences = new int[differencesCount];
for (int i = 1; i < ones; i++)
differences[i - 1] = indices.get(i) - indices.get(i - 1) - 1;
int[] prefixSums = new int[differencesCount];
prefixSums[0] = differences[0];
for (int i = 1; i < differencesCount; i++)
prefixSums[i] = prefixSums[i - 1] + differences[i];
int[] postfixSums = new int[differencesCount];
postfixSums[differencesCount - 1] = differences[differencesCount - 1];
for (int i = differencesCount - 2; i >= 0; i--)
postfixSums[i] = postfixSums[i + 1] + differences[i];
int moves = getSum(differences, k);
int minMoves = moves;
int intervals = k - 1;
for (int i = intervals; i < differencesCount; i++) {
moves -= getPrefixSum(prefixSums, i - intervals, i - intervals + k / 2 - 1);
moves += getPostfixSum(postfixSums, i - k / 2 + 1, i);
minMoves = Math.min(minMoves, moves);
}
return minMoves;
}
public int getSum(int[] differences, int k) {
int sum = 0;
int left = 0, right = k - 2;
while (left < right) {
sum += (differences[left] + differences[right]) * (left + 1);
left++;
right--;
}
if (left == right)
sum += differences[left] * (left + 1);
return sum;
}
public int getPrefixSum(int[] prefixSums, int start, int end) {
if (start == 0)
return prefixSums[end];
else
return prefixSums[end] - prefixSums[start - 1];
}
public int getPostfixSum(int[] postfixSums, int start, int end) {
if (end == postfixSums.length - 1)
return postfixSums[start];
else
return postfixSums[start] - postfixSums[end + 1];
}
}
리트코드
도전
문제에 대한 링크는 다음과 같습니다.
https://leetcode.com/problems/minimum-adjacent-swaps-for-k-consecutive-ones/
Reference
이 문제에 관하여(1703. JAVA의 Leetcode 솔루션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/chiki1601/1703-leetcode-solution-in-cpp-3a2j
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
문제에 대한 링크는 다음과 같습니다.
https://leetcode.com/problems/minimum-adjacent-swaps-for-k-consecutive-ones/
Reference
이 문제에 관하여(1703. JAVA의 Leetcode 솔루션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/chiki1601/1703-leetcode-solution-in-cpp-3a2j텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)