LeetCode 1004. Max Consecutive Ones III
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 <= 105
nums[i] is either 0 or 1.
0 <= k <= nums.length
한글 해석
이진 배열 nums과 정수가 주어졌을 때 k, 최대 '의 개수를 뒤집을 수 있다면 배열에서 연속된 '의 최대 개수를 반환합니다. 1 k 0
예시 1:
입력: nums = [1,1,1,0,0,0,1,1,1,1,0], k = 2
출력: 6
설명: [1,1,1,0,0, 1 ,1,1,1,1, 1 ]
굵은 글씨로 표시된 숫자는 0에서 1로 뒤집혔습니다. 가장 긴 부분 배열은 밑줄이 그어져 있습니다.
예시 2:
입력: nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], k = 3
출력: 10
설명: [0,0, 1,1, 1 , 1 ,1,1,1, 1 ,1,1 ,0,0,0,1,1,1,1]
굵은 글씨로 표시된 숫자는 0에서 1로 뒤집혔습니다. 가장 긴 부분 배열은 밑줄이 그어져 있습니다.
제약사항:
1 <= nums.length <= 105
nums[i]0또는 둘 중 하나 입니다 1.
0 <= k <= nums.length
문제 유형
정렬
이진 탐색
슬라이딩 윈도우
누적 합
풀이 방법 도출
이 문제는 슬라이딩 윈도우 기법을 사용하여 해결할 수 있습니다.
연속된 1의 최대 길이를 구하지만 최대 k개의 0을 1로 뒤집을 수 있습니다.
즉, 0이 k개 이하인 가장 긴 구간을 찾는 문제입니다.
슬라이딩 윈도우를 사용하여 left와 right 두 포인터로 구간을 확장 및 축소하면서 조건을 만족하는 최대 길이를 구해야 합니다.
- right 포인터를 이동하며 구간에 포함되는 숫자를 확인합니다.
- nums[right] == 0이면 사용할 수 있는 flip 횟수인 k를 1 감소시킵니다.
- 만약 flip 가능 횟수(k)가 음수가 되면 (0을 많이 포함한 경우) left 포인터를 오른쪽으로 이동시켜 구간을 줄입니다.
- 줄이면서 nums[left] == 0이면 flip 횟수 k를 다시 증가시킵니다.
- 매 반복마다 구간의 길이 (right - left + 1)를 계산해서 최대값을 갱신합니다.
시간 복잡도
- O(N)
핵심 코드 삽입 및 설명
from typing import List
class Solution:
def longestOnes(self, nums: List[int], k: int) -> int:
left = 0 # 윈도우의 왼쪽 포인터
max_length = 0 # 최대 연속 1의 길이
# 오른쪽 포인터를 이동하면서 윈도우 확장
for right in range(len(nums)):
if nums[right] == 0:
k -= 1 # 0을 만났을 때 flip 기회를 하나 사용
# flip 기회를 초과한 경우 윈도우의 왼쪽을 이동시키며 0 제거
while k < 0:
if nums[left] == 0:
k += 1 # 왼쪽 포인터가 가리키는 값이 0이면 flip 기회 복구
left += 1 # 왼쪽 포인터를 오른쪽으로 이동
# 현재 윈도우의 길이를 계산하고 최대값 갱신
max_length = max(max_length, right - left + 1)
return max_length
'Study > 코딩 테스트' 카테고리의 다른 글
[LeetCode] 1493. Longest Subarray of 1's After Deleting One Element 해설 및 풀이 (Python) (0) | 2025.04.09 |
---|---|
[LeetCode] 11. Container With Most Water 해설 및 풀이 (Python) (0) | 2025.04.08 |
[99클럽 코테 스터디 9일차 TIL] 백준 3986번 좋은 단어 해설 및 풀이 (Java, Python) (0) | 2025.04.08 |
[99클럽 코테 스터디 8일차 TIL] LeetCode 70. Climbing Stairs 해설 및 풀이 (Java) (0) | 2025.04.07 |
[프로그래머스] Lv.1 완주하지 못한 선수 해설 및 풀이 (Python) (0) | 2025.04.07 |