Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 하나의 요소만 삭제한 후 최대 및 최소를 포함하는 하위 목록의 수를 찾는 프로그램

<시간/>

num이라는 숫자 목록이 있고 목록에서 최대 하나의 요소를 삭제할 수 있다고 가정합니다. 결과 목록의 최대값과 최소값을 모두 포함하는 하위 목록의 최대 수를 찾아야 합니다.

따라서 입력이 nums =[3, 2, 6, 2, 4, 10]과 같으면 출력은 8이 됩니다. 마치 10을 제거하면 [3, 2, 6, 2, 4]가 되고 최대값과 최소값을 모두 포함하는 8개의 하위 목록이 있습니다. -

  • [2, 6]

  • [6, 2]

  • [2, 6, 2]

  • [3, 2, 6]

  • [6, 2, 4]

  • [2, 6, 2, 4]

  • [3, 2, 6, 2]

  • [3, 2, 6, 2, 4].

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • check() 함수를 정의합니다. 시간이 걸립니다

  • mn :=lst의 최소값, mx :=lst의 최대값

  • min_pos :=null, max_pos :=null

  • ret :=0

  • lst의 각 인덱스 i와 값 num에 대해 수행

    • num이 mn과 같으면

      • min_pos :=나는

    • num이 mx와 같으면

      • max_pos :=나는

    • min_pos가 null이거나 max_pos가 null이면

      • 다음 반복으로 이동

    • ret :=ret + min_pos의 최소값 및 (max_pos + 1)

  • 리턴 렛

  • 주요 방법에서 다음을 수행하십시오 -

  • 숫자의 크기가 <=1이면

    • 숫자의 크기를 반환

  • ret :=체크(숫자)

  • [minimum of nums , maximum of nums ]의 각 rem_cand에 대해 수행

    • rem_cand의 발생이 1이면

      • idx :=rem_cand의 인덱스(숫자)

      • ret :=최대 ret 및 check(nums[인덱스 0에서 idx - 1] 연결 nums[인덱스 idx + 1에서 끝까지]

  • 리턴 렛

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

class Solution:
   def solve(self, nums):
      if len(nums) <= 1:
         return len(nums)
      def check(lst):
         mn, mx = min(lst), max(lst)
         min_pos, max_pos = None, None
         ret = 0
         for i, num in enumerate(lst):
            if num == mn:
               min_pos = i
            if num == mx:
               max_pos = i
            if min_pos is None or max_pos is None:
               continue
            ret += min(min_pos, max_pos) + 1
         return ret
      ret = check(nums)
      for rem_cand in [min(nums), max(nums)]:
         if nums.count(rem_cand) == 1:
            idx = nums.index(rem_cand)
            ret = max(ret, check(nums[:idx] + nums[idx + 1 :]))
      return ret
ob = Solution()
nums = [3, 2, 6, 2, 4, 10]
print(ob.solve(nums))

입력

[3, 2, 6, 2, 4, 10]

출력

8