문제

내가 하고있 LeetCode 고 달려들의 문제 3Sum 및을 할 O(nlogn)솔루션을 본 후 제안하는 방법을 지속적으로 연구하는 솔루션 $O(n^2)$$O(n^2\번\로그 n)$ 그 뿐만 아니지만 문제는 고도로 연구 주제 그래서 나는 생각하지 않는 더 나은 솔루션이지만 볼 수 없다는 이유 접근 방식을 작동하지 않을 것을 사용할 수 있습니다,그것을 파악하는 데 도움이.

문제는 다음과 같다
을 찾을 세 번호에 배열한 것 $+b+c=t$,
LeetCode 문제 에 약간 다를 찾을 필요가있는 가장 가까 합니다.

내 코드는 다음과 같다:

  1. 정렬 배열입니다.
  2.   시작으로 두 개의 포인터 i=0j= last element of array
  3.     사용진 사이에서 검색 ij 을 찾기 marr[m] == target - arr[i] - arr[j], 는 경우,그러한 m 존재하지 않는 돌아 marr[m] 가장 가까.
  4.     는 경우 arr[i] + arr[m] + arr[j] == target 다음의 완료됩니다.
  5.     그렇지 않을 경우 arr[i] + arr[m] + arr[j] < target 다음에 추가 1 i 다른 사람을 빼 1 양식 j.
  6. 3→5 j - i == 2
  7. 최고의 반환 발견 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,을 가정하고 있는 요소가 그냥 고급 과거는 필요하지 않습--존재가 있는 솔루션을 포함하지 않습니다.그러나 이것은 정당화되지 않은 아무것도에 의해,그리고 그것은 잘 될 수 있는 모든 솔루션을 필요로하는 요소입니다.

을 테스트하는 좋은 방법 알고리즘은 아이디어 이 같은 작은 프로그램을 생성하는 많은 작은 랜덤 입력 및 결과를 비교하는 알고리즘에는 그들의 각각의 결과 알려진 올바른 무차별 접근 방식이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top