3Sum 왜 이 O(nlogn)솔루션을 작동하지 않는 이유는 무엇입니까?
-
29-09-2020 - |
문제
내가 하고있 LeetCode 고 달려들의 문제 3Sum 및을 할 O(nlogn)솔루션을 본 후 제안하는 방법을 지속적으로 연구하는 솔루션 $O(n^2)$ 나 $O(n^2\번\로그 n)$ 그 뿐만 아니지만 문제는 고도로 연구 주제 그래서 나는 생각하지 않는 더 나은 솔루션이지만 볼 수 없다는 이유 접근 방식을 작동하지 않을 것을 사용할 수 있습니다,그것을 파악하는 데 도움이.
문제는 다음과 같다
을 찾을 세 번호에 배열한 것 $+b+c=t$,
이 LeetCode 문제 에 약간 다를 찾을 필요가있는 가장 가까 합니다.
내 코드는 다음과 같다:
- 정렬 배열입니다.
i=0
고j= last element of array
i
고j
을 찾기m
러arr[m] == target - arr[i] - arr[j]
, 는 경우,그러한m
존재하지 않는 돌아m
러arr[m]
가장 가까.arr[i] + arr[m] + arr[j] == target
다음의 완료됩니다.arr[i] + arr[m] + arr[j] < target
다음에 추가 1i
다른 사람을 빼 1 양식j
.- 3→5
j - i == 2
- 최고의 반환 발견
i,m,j
논리에는 5 단계가 있는 경우에는 솔루션을 찾을 수 더 이상 그런 다음 우리는 증가 i
하는 등 우리의 다음 생각합니다.
코드:
def binSearch(arr, s, e, t):
m = (s + e) // 2
r = m
d = 9999
while s <= e:
m = (s + e) // 2
if arr[m] == t:
return m
elif arr[m] > t:
e = m - 1
else:
s = m + 1
if d > abs(t - arr[m]):
d = abs(t - arr[m])
r = m
return r
class Solution:
def threeSumClosest(self, nums, target: int) -> int:
nums.sort()
s = 0
e = len(nums) - 1
minn = 999999
t = ()
while e - s >= 2:
left = nums[s]
right = nums[e]
remaining = target - (left + right)
m = binSearch(nums, s + 1, e - 1, remaining)
middle = nums[m]
r = left + middle + right
# print("i's: ", (s,m,e))
# print("values: ", (nums[s], nums[m], nums[e]))
# print("r", r)
# print("**************")
if r == target:
return r
elif r < target:
s += 1
else:
e -= 1
if abs(target - r) < minn:
minn = abs(target - r)
t = r
return t
해결책
이 실패하면,예를 들어,, [1, 9, 55, 55, 100], t=111.첫 번째 반복 발견 110 증가하 제외 1 으로 가능하지만,유일한 솔루션[1,55,55],필요 1.
기본적인 문제는 당신이 증가 또는 감소 j,을 가정하고 있는 요소가 그냥 고급 과거는 필요하지 않습--존재가 있는 솔루션을 포함하지 않습니다.그러나 이것은 정당화되지 않은 아무것도에 의해,그리고 그것은 잘 될 수 있는 모든 솔루션을 필요로하는 요소입니다.
을 테스트하는 좋은 방법 알고리즘은 아이디어 이 같은 작은 프로그램을 생성하는 많은 작은 랜덤 입력 및 결과를 비교하는 알고리즘에는 그들의 각각의 결과 알려진 올바른 무차별 접근 방식이다.
제휴하지 않습니다 cs.stackexchange