A Array_Max Consecutive Ones

김의석 ·2025년 2월 28일

leetcode

목록 보기
1/4

1. Problem Description

link

Summary
주어진 배열에서 1의 최대 개수를 구하는 문제

example

Input: nums = [1,1,0,1,1,1]
Output: 3

Constraints

1 <= nums.length <= 105
nums[i] is either 0 or 1.
  • num의 요소는 1 아니면 0 으로 if 조건문 설정에 참고 하였습니다.

2. Approach to the Problem

  • 1의 개수를 세며 최댓값을 갱신하는 방식입니다.
  • 주어진 배열을 순회하면서 1이 계속되는 동안 현재 길이가 증가 합니다.
  • 0을 만나면 현재 길이와 최대 길이를 갱신합니다.

3. Code and Explanation

from typing import List

class Solution:
    def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
        maxlen = 0
        presentlen = 0

        for i in nums:
            if i == 1:
                presentlen +=1
            else:
                maxlen = max(maxlen, presentlen)
                presentlen = 0

        return max(maxlen, presentlen)
  • maxlen : 최대 연속된 1의 길이 입니다.
  • presentlen : 현재 연속된 1의 길이 입니다.
  • for i in nums : 리스트를 순회하며 1이면 presentlen 증가 합니다.
  • 0을 만나면 maxlen을 갱신하고 presentlen을 초기화 합니다.
  • 마지막 요소 1인 경우를 고려하여 retrun max(maxlen, presentlen)에서 갱신합니다.

4. Time and Space Complexity Analysis

Time Complexity

  • O(N) (리스트 한 번 순회)

Space Complexity

  • O(1) (추가적인 데이터 저장 X)

✅ O(N) 시간 복잡도 → 입력 크기(N)만큼 연산 수행 (리스트 한 번 순회)
✅ O(1) 공간 복잡도 → 입력 크기에 관계없이 일정한 메모리 사용 (추가 리스트 없이 변수만 사용)

5. Alternative Approaches

class Solution(object):
    def findMaxConsecutiveOnes(self, nums):
        cnt = 0
        ans = 0
        for num in nums:
            if num == 1:
                cnt += 1
                ans = max(ans, cnt)
            else:
                cnt = 0
        return ans
  • cnt : 현재길이 입니다.
  • ans : 최댓값 입니다.
  • 루프 안에서 모든 경우를 처리합니다.
  • 기존 코드는 반복문 종료 후 print(max(maxlen, presentlen))을 추가적으로 실행해야 합니다. 최대 2N번의 max() 호출 발생
  • max() 호출 횟수가 최대 절반 이하로 감소 → 미세한 성능 향상이 있습니다.

6. Improvements

  • maxlen이 갱신되면 presentlen는 초기화 되어야 합니다.
  • 마지막 값이 1일 경우 max() 갱신 필요 합니다.

7. Conclusion

  • 연속된 1의 개수를 저장하며 최대값을 갱신하면 해결 가능 합니다.
profile
널리 이롭게

0개의 댓글