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