티스토리 뷰
Problem
Given a binary array nums and an integer k, return the maximum number of consecutive 1's in the array if you can flip at most k 0's.
Example 1:
Input: nums = [1,1,1,0,0,0,1,1,1,1,0], k = 2
Output: 6
Explanation: [1,1,1,0,0,1,1,1,1,1,1]
Bolded numbers were flipped from 0 to 1. The longest subarray is underlined.
Example 2:
Input: nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], k = 3
Output: 10
Explanation: [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
Bolded numbers were flipped from 0 to 1. The longest subarray is underlined.
Constraints:
- 1 <= nums.length <= 10^5
- nums[i] is either 0 or 1.
- 0 <= k <= nums.length
Solution
0과 1로 이루어진 배열에서 최대 k개의 0을 1로 바꿔서 얻을 수 있는 연속된 1의 가장 긴 길이를 구하는 문제입니다.
package io.lcalmsky.leetcode.max_consecutive_ones_iii;
public class Solution {
public int longestOnes(int[] nums, int k) {
int start = 0, end = 0, zeroes = 0;
while (end < nums.length) {
if (nums[end] == 0) {
zeroes++;
}
end++;
if (zeroes > k) {
if (nums[start] == 0) {
zeroes--;
}
start++;
}
}
return end - start;
}
}
- int start = 0, end = 0, zeroes = 0;: 슬라이딩 윈도우를 위한 포인터 변수들을 초기화합니다. start는 윈도우의 시작 인덱스를 가리키고, end는 윈도우의 끝 인덱스를 가리키며, zeroes는 현재 윈도우 내에 있는 0의 개수를 저장합니다.
- while (end < nums.length): end 포인터가 배열의 끝에 도달할 때까지 반복합니다. 이렇게 함으로써 모든 윈도우를 순회하면서 최대 길이를 구합니다.
- if (nums[end] == 0): 현재 원소가 0인 경우, zeroes를 증가시킵니다.
- end++;: end 포인터를 오른쪽으로 이동하여 윈도우를 확장합니다.
- if (zeroes > k): 윈도우 내에 있는 0의 개수가 최대 허용 개수 k를 초과하는 경우를 처리합니다.
- if (nums[start] == 0): start 포인터가 가리키는 원소가 0인 경우, 윈도우 내의 0 개수를 감소시킵니다. 이렇게 함으로써 윈도우를 왼쪽으로 이동하여 길이를 줄입니다.
- start++;: start 포인터를 오른쪽으로 이동하여 윈도우를 축소합니다.
- 최종적으로 end - start를 반환합니다. 이 값은 최대 k개의 0을 1로 바꿔서 얻을 수 있는 연속된 1의 가장 긴 길이가 됩니다.
이 코드는 슬라이딩 윈도우를 사용하여 최대 k개의 0을 1로 바꿔서 얻을 수 있는 연속된 1의 최대 길이를 효율적으로 계산합니다. 시간 복잡도는 O(N)입니다. 여기서 N은 배열 nums의 길이입니다.
Test
package io.lcalmsky.leetcode.max_consecutive_ones_iii;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SolutionTest {
@Test
void testAll() {
assertAll(
() -> test(new int[]{1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0}, 2, 6),
() -> test(new int[]{0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1}, 3, 10)
);
}
private void test(int[] nums, int k, int expected) {
// when
Solution solution = new Solution();
int actual = solution.longestOnes(nums, k);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode] 2352. Equal Row and Column Pairs (0) | 2023.07.30 |
---|---|
[LeetCode] 1493. Longest Subarray of 1's After Deleting One Element (0) | 2023.07.29 |
[LeetCode] 1456. Maximum Number of Vowels in a Substring of Given Length (0) | 2023.07.27 |
[LeetCode] 155. Min Stack (0) | 2023.07.22 |
[LeetCode] 300. Longest Increasing Subsequence (0) | 2023.07.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- leetcode
- 스프링부트
- Spring Boot
- 스프링 부트 회원 가입
- Spring Data JPA
- Java
- QueryDSL
- 스프링 부트
- gRPC
- Spring Boot Tutorial
- 함께 자라기 후기
- proto3
- intellij
- r
- JPA
- 함께 자라기
- @ManyToOne
- 스프링 데이터 jpa
- spring boot jwt
- 클린 아키텍처
- 헥사고날 아키텍처
- 스프링 부트 애플리케이션
- Linux
- 알고리즘
- spring boot app
- Jackson
- Spring Boot JPA
- JSON
- 스프링 부트 튜토리얼
- spring boot application
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함