Leetcode 매일 한 문제--사고방식 소기

6403 단어 LeetCode

기사 목록

  • LeetCode 매일 한 문제golang
  • T15 2020.6.12 삼수의 합, 쌍바늘의 운용
  • T70 2020.6.13 피보나치 수열
  • T1014 2020.6.17 최적 관광: 쌍지침, 계산 공식 전환, 국부 최대치의 구해 최적화
  • T1028 2020.6.18 2차원 트리 복원, 역행 관계와 좌중우의 관계
  • T125 2020.6.19 뒤섞인 문자열
  • T10 2020.6.20 정규 일치, *.알파벳
  • T124 2020.6.21 트리의 최대 경로 및
  • T63 2020.7.6 다른 경로
  • T112 2020.7.7 경로 찾기 및 주어진 값
  • T2020.7.8면 문제16.11 다이빙판
  • Leet Code 매일 한 문제, golang.


    T15 2020.6.12 세 개의 합, 쌍바늘의 활용


    중복 문제 없음 -> 정렬, 같은 값이 정렬 배열에서 건너뛰기 - Fix A,find B+C = A의 방식: 이중 포인터.x1

    T70 2020.6.13 피보나치 수열


    계단 오르기, 고전적인 동적 기획, 피보나치 수열, 세 가지 변수로 공간을 절약할 수 있습니다.

    T1014 2020.6.17 최적 관광: 쌍지침, 계산 공식 전환, 국부 최대치의 구해 최적화


    베스트 관광조합.사고방식은 먼저 O(n^2)의 폭력 검색을 하고 소박한 관찰을 결합시켜 최적화 방법을 얻는 것이다.
    계산value의 공식은 A[i] + A[j] + i - j : ( i < j )이기 때문에 i, j을 한데 묶으면 직감적으로 사고에 유리하다.공식화 (A[i] + i) + (A[j] - j) : ( i < j )예시된 수조[8,1,5,2,6]를 이 계산 방식에 따라 두 개의 수조로 전개하다.(A[i]+i) 8 2 7 5 10 (A[j]-j) 8 0 3 -1 2
    위에서 하나의 수를 찾고, 그것의 오른쪽 아래에서 가장 큰 수를 더하면 결과이다.예를 들어 8+0 8+3 8-1 8+2는 모두 가능합니다. 그러면 어떻게 최대 해를 찾습니까?
    우리는 j 인덱스를 계속 추진한다. 예를 들어 3이라는 위치로 추진하면 j=3시에 최대치는 8, 2에서 최대치를 선택하고 j=3의 값을 추가한다.j(아래 그룹)를 훑어보고 i(위 그룹)의 최대 값을 업데이트하는 아이디어를 얻을 수 있습니다.각 j에 대응하는 최대치를 얻을 수 있다.

    T1028 2020.6.18 2차원 트리 복원, 반복 관계와 좌중우측 관계


    두 갈래 나무를 차례대로 복원하다.동시에 노드가 하나의 하위 노드만 있다면 이 하위 노드가 왼쪽 하위 노드임을 보증합니다.선순환의 특징: 뿌리 좌우.그러면 한 개의 수조 A1 A2 A3 A4를 훑어보거나... 하나씩 훑어보거나 앞의 왼쪽 노드(상술한 굵은 제한으로 왼쪽이 비어 있을 수 없음), 아니면 이전에 훑어보던 어느 오른쪽 노드를 훑어보거나.
    제목을 받았는데 어리둥절하면서도 나무 구조에 익숙하지 않다.
    이 문제의 핵심 사고방식은 창고를 유지하고 창고 꼭대기 요소에 하위 노드를 찾는 것이다.

    T125 2020.6.19 뒤섞인 문자열


    회문열을 검증하다.비교적 간단하다. 상관없는 문자를 만나면 건너뛰면 된다. 두 바늘 만남법.

    T10 2020.6.20 정규 일치, *.자모


    정규 일치.어렵다dp 방법, s[i][j]는pattern[1,j]와string[1,i]가 일치하는지 여부를 나타낸다.점차적으로 밀어붙이는 방식은 비교적 복잡하다. 첫 번째 층은 *와 비를 구분하는 것이다.2층에서 x의 추이식을 찾았다.
    	// f[i][j]
    	// p[j] != "*" : if p[j] == s[i] { f[i][j] = f[i-1][j-1] } else { f[i][j] = false }
    	// p[j] == "*" : if p[j-1] == s[i] { f[i][j] = f[i-1][j] or f[i][j-2] } else { f[i][j] = f[i][j-2] }
    

    T124 2020.6.21 트리의 최대 경로 및


    주요 사고방식: 나무의 귀속.하나의 노드에 대해 말하자면 최대 경로가 존재하는 곳: 왼쪽 + 중 + 오른쪽, 또는 루트 + 오른쪽의 최대 값, 또는 루트 + 왼쪽의 최대 값.위의 노드에 대한 공헌은 좌+중 또는 우+중에 해당한다.주의해야 할 것은 노드 값이 0보다 작고 어떤 루트 노드의 왼쪽이 가장 크므로 0과 비교해야 한다는 것이다.
    나무의 귀속, 통용적인 사고방식: 이 층이 (좌우 노드에 의존해서) 무엇을 얻을 수 있는지, 이 층이 필요로 하는지(상층에 어떤 결과를 제공할 수 있는지).

    T63 2020.7.6 다른 경로


    한정은 오른쪽과 아래로만 갈 수 있기 때문에 dp는 쉽게 쓸 수 있다.dp[i][j] = dp[i-1][j]+dp[i][j-1].별 어려움이 없다.

    T112 2020.7.7 경로 및 지정된 값 찾기


    두 갈래 나무의 귀속은 매번sum로 node를 뺀다.Val은 자목의 입삼이다.

    T2020.7.8면 문제16.11 다이빙판


    모두 k개를 사용하기 때문에 i를 두루 훑어보고 ilongerk-ishorter를 찾으려고 생각하기 쉽다.또 중복이 없고 점차적으로 증가하는 것을 요구하는데 번거로움은 무게를 줄이는 데 있다. 그러나 몇 수를 계산해 보면 중복이 없을 것이다. 만약shorter < longer이 주어진k, j > i, (k-j)*shorter+longer*j - [(k-i)*shorter+longer*i] = (j-i)*(longer-shorter) 그리고longer > shorter가 반드시 0보다 크기 때문에 점차적으로 증가하고 같지 않기 때문이다.그래서 무겁게 할 필요가 없고 반드시 단조롭게 증가할 것이다.또한 j > i의 경우 위의 차분식이 0과 같다는 것을 알 수 있다. 이것은 모든 값이 같고 한 수만 되돌려주면 된다는 것이다.
    func divingBoard(shorter int, longer int, k int) []int {
        if k == 0{
            return nil
        }
        if shorter == longer{
            return []int{shorter*k}
        }
        m := make([]int, k+1)
        for i:=0;i<=k;i++{
            m[i] = (k-i)*shorter + longer*i
        }
        return m
    }
    

    좋은 웹페이지 즐겨찾기