algorithms_and_data_structures
1.0.0
현황 | 통계 |
---|---|
총 C++ 문제 | 188 |
총 Python 문제 | 15 |
현재 일일 연속 | 11 |
마지막 연속 | 2019년 6월 20일 - 2019년 6월 21일 |
현재 연속 | 2019년 6월 23일 - 2019년 7월 3일 |
참고: 여기에 있는 코드 중 일부는 오래되었으며 C++를 배울 때 작성되었습니다. 코드가 안전하지 않거나 잘못된 가정을 하고 있을 가능성이 있습니다. 주의해서 사용하십시오. Pull Request는 언제나 환영합니다.
문제 | 해결책 |
---|---|
연결리스트의 마지막 노드에서 n번째 노드를 찾습니다. | nthToLastNode.cpp, nth_to_last_node.py |
숫자의 각 숫자가 연결 목록의 노드로 표시되는 숫자를 추가합니다. 출력을 연결된 목록으로 제공합니다. | add_two_numbers_lists.cpp, add_two_numbers_list.py |
데이터를 교환하지 않고 링크드리스트의 노드를 교환합니다. | swapNodesWithoutSwappingData.cpp, swap_nodes_without_swapping_data.py |
반복적, 재귀적으로 연결된 목록을 뒤집습니다. | reverseLinkedListIterAndRecurse.cpp, reverse_linkedlist.py |
연결된 목록이 주어지면 대체 노드를 뒤집고 끝에 추가합니다. | reverseAlternateNodes.cpp |
노드 포인터만 주어지면 연결 리스트에서 노드를 삭제합니다. | deleteNode.cpp |
전체 링크리스트를 삭제합니다. | deleteLinkedlist.cpp |
두 번 반복하지 않고 연결 목록의 중간 노드를 인쇄합니다. | printMiddleNode.cpp |
연결리스트가 회문인지 확인합니다. | listPallindrome.cpp |
정렬된 연결 목록에 데이터를 삽입합니다. | insertInASortedLinkedList.cpp |
주어진 두 연결리스트의 교차(병합) 지점을 결정합니다. | findIntersectionPointOfLists.cpp, Intersection_of_lists.py |
다음 포인터와 임의 포인터인 공간 복잡도 - O(1)가 있는 연결 목록을 복제합니다. | cloneListWithRandomPtr.cpp, clone_list_with_random_ptr.py |
중복 항목이 포함된 정렬된 연결 목록이 주어지면 한 번의 반복으로 중복 항목을 제거합니다. | 제거DuplicatesFromSortedList.cpp |
Floyd의 주기 찾기 알고리즘을 사용하여 연결 목록에 주기가 포함되어 있는지 확인하고, 주기가 포함되어 있으면 루프를 제거합니다. | floyedCycleDetection.cpp |
병합 정렬을 사용하여 연결 목록 정렬 | merge_sort.cpp |
단일 연결 목록이 주어지면 L 0 -> L 1 -> … -> L n-1 -> L n . 새로 형성된 목록이 L 0 -> L n -> L 1 -> L n-1 -> L 2 -> L n-2 ... 가 되도록 목록의 노드를 제자리에 다시 배열합니다. | 재배열_목록.cpp |
포함에는 데이터 구조와 일부 알고리즘의 단일 헤더 구현이 포함됩니다.
데이터 구조/알고리즘 | 구현 |
---|---|
스왑, 난수 생성과 같은 일반 매크로 및 알고리즘 | 일반.h |
일반 스택 구현 | 스택.h |
일반 대기열 구현 | 큐.h |
일반 목록 구현 | 목록.h |
이진 검색 트리 구현 | 바이너리검색트리.h |
빠른 정렬 구현 | 빠른 정렬.h |
병합 정렬 구현 | mergeSort.h |
선택 정렬 구현 | SelectionSort.h |
버블정렬 구현 | bubbleSort.h |
Linux 커널 Double LinkedList 구현 | double_linked_list.h |
일반 그래프 구현(인접 목록) | 그래프.h |
힙 정렬 구현 | heap_sort.h |
내 자신의 문자열 라이브러리 구현 | pstring.h pstring.cpp |
문제 | 해결책 |
---|---|
숫자가 2의 거듭제곱인지 확인합니다. | power_of_2.cpp |
문자열로 표현되는 두 개의 이진수를 추가합니다. | addBin.cpp |
주어진 숫자에 대해 다음 2의 거듭제곱을 결정합니다. | next_power_of_2.cpp |
비트 조작을 사용하여 숫자가 3의 배수인지 확인합니다. | multiple_of_3.cpp |
기계의 엔디안을 결정하고 역 엔디안으로 숫자를 인쇄하십시오. | reverseEndianness.cpp |
주어진 숫자의 패리티를 찾으세요. | find_parity.cpp |
비트 조작을 사용하여 숫자를 7로 빠르게 곱하는 방법을 구현합니다. | Multiply_by_7.cpp |
부호 없는 정수의 비트를 반전시킵니다(두 가지 방법 - 비트별로 반전 및 분할 및 정복). | reverseBitsOfAnInteger.cpp |
주어진 정수에서 가장 오른쪽에 설정된 비트의 위치를 결정하는 작은 함수입니다. | right_most_set_bit.cpp |
숫자로 구성된 벡터가 주어지면 하나의 숫자만 홀수 번 발생합니다. 숫자를 찾으세요. | find_odd_one_out.cpp |
두 개의 정수가 주어지면 그 합이 정수 오버플로인지 확인합니다. | 정수오버플로우.cpp |
숫자 A를 B로 변환하는 데 필요한 비트 뒤집기 작업 수입니다. | countNumberOfBitFlips.cpp |
숫자 x와 x의 이진 표현에서 두 위치(오른쪽부터)가 주어지면, 주어진 두 위치에서 오른쪽 n 비트를 교환하고 결과를 반환하는 함수를 작성하세요. 또한 두 비트 세트가 겹치지 않는 것으로 가정됩니다. | swapSetOfBits.cpp |
산술 연산자를 사용하지 않고 두 숫자 더하기 | 추가_없이_연산자.cpp |
Louise와 Richard가 게임을 하고 있습니다. 카운터는 N으로 설정되어 있습니다. Louise가 첫 번째 턴을 갖고 그 이후 턴이 번갈아 가며 이루어집니다. 게임에서는 다음 작업을 수행합니다.
| counter_game.cpp |
두 정수의 부호가 반대인지 확인합니다. | check_opposite_signs.cpp |
주어진 정수의 p와 q 위치에서 두 비트를 교환합니다. | swapBits.cpp |
숫자가 4의 거듭제곱인지 확인하세요. | check_if_power_of_4.cpp |
문제 | 해결책 |
---|---|
문제 1-1: 에디션 6: 문자열에 고유한 문자가 있는지 여부를 확인하는 알고리즘을 작성하세요. 추가 데이터 구조를 사용하지 않고 이를 수행할 수 있습니까? | 1-1-hasUniqueChars.cpp, 1-1-hasUniqueChars.py |
문제 1-2: 버전 5: null로 끝나는 C 문자열을 전달할 때 문자열을 뒤집습니다. | 1-2-edi5-reverseString.cpp |
문제 1-2: 에디션 6: 두 개의 문자열이 주어지면 하나가 다른 문자열의 순열인지 확인합니다. | 1-2-perm-strings.cpp, 1-2-perm-strings.py |
문제 1-3: 에디션 5: 문자열에서 중복된 문자를 제거하는 알고리즘을 작성하세요. | 1-3-edi5-removeDuplicates.cpp |
문제 1-3: 에디션 6: URLify: 문자열의 모든 공백을 '%20'으로 바꿉니다. 바람직하게는 제자리에 있음 | 1-3-URLify.cpp |
문제 1-4: 에디션 6: 문자열이 주어지면 그것이 회문의 순열인지 확인하는 함수를 작성하세요. | 1-4-팔린드롬-순열.cpp |
문제 1-5: 에디션 6: 문자열에 대해 수행할 수 있는 편집에는 세 가지가 있습니다. 즉, 문자 삽입, 문자 삭제, 문자 바꾸기입니다. 두 개의 문자열이 주어지면 한 번 편집할 수 있는지 아니면 0번 편집할 수 있는지 확인합니다. | 1-5-one-edit-away.cpp |
문제 1-6: 기본 문자열 압축을 수행하는 방법을 구현합니다. 예제 문자열 aabcccccaaa는 a2b1c5a3 으로 압축되어야 하지만 압축된 문자열이 원래 문자열보다 큰 경우 원래 문자열을 반환합니다. | 1-6-문자열-압축.cpp |
문제 1-7: 행렬을 시계 방향(& 반시계 방향)으로 90도 회전 | 1-7-행렬-회전.cpp |
문제 1-8: MxN 행렬의 요소가 0이면 행과 열 전체가 0으로 설정되는 알고리즘을 작성하세요. | 1-8-제로-행렬.cpp |
문제 1-9: 두 문자열 s1과 s2가 주어지면 한 문자열이 다른 문자열의 회전인지 확인하는 함수를 한 번만 호출하여 s2가 s1의 회전인지 결정합니다. | 1-9-문자열-회전.cpp |
문제 2-1: 정렬되지 않은 연결 목록에서 중복 항목을 제거합니다. 임시 버퍼가 허용되지 않으면 어떻게 될까요? | 2-1-제거-dups.cpp |
문제 2-2: 단일 연결 리스트의 마지막 노드에서 k 번째 노드를 결정합니다. (반복 및 재귀 접근 방식) | 2-2-kthToLast.cpp |
문제 2-3: 단일 연결 리스트 중간에 있는 노드를 삭제하는 알고리즘 구현하기 | 2-3-삭제-중간-node.cpp |
문제 2-4: 값 x를 중심으로 연결 리스트를 분할합니다. x보다 작은 모든 노드는 x보다 큰 모든 노드 앞에 옵니다. | 2-4-partition.cpp |
문제 2-5: 각 노드가 한 자리 숫자를 포함하는 연결 리스트로 표시되는 두 개의 숫자가 있습니다. 숫자는 역순으로 저장되므로 1의 숫자가 목록의 맨 위에 오게 됩니다. 두 숫자를 더하고 그 합계를 연결된 목록으로 반환하는 함수를 작성하세요.예:
| 2-5-추가 목록.cpp |
문제 2-6: 연결된 목록이 회문인지 확인(2개의 반복 접근과 하나의 재귀 접근) | 2-6-palindrome.cpp |
문제 2-7: 두 개의 단일 연결 리스트가 교차하는지 확인하고, 교차하는 노드를 반환합니다. 교차점은 값이 아닌 참조를 기반으로 정의됩니다. | 2-7-intersection.cpp |
문제 2-8: 연결리스트에 루프가 있는지 감지하고 루프의 시작 노드를 찾아 루프를 제거합니다. | 2-8-루프-탐지.cpp |
문제 | 해결책 |
---|---|
다양한 메모 기술을 사용한 N 번째 피보나치 항 | fibonacci.cpp |
최장 공통 부분 수열 문제 | lcs.cpp, 가장 긴_common_subsequence.py |
최대값 연속 부분수열 문제 위키 | max_subsequence.cpp |
카탈로니아 수 - n 키를 사용하여 가능한 이진 검색 트리 수 계산 | catalan_number.cpp |
amxn 그리드에서 소스 원점(0, 0)에서 대상(m-1, n-1)까지의 고유 경로 수를 계산합니다. 아래쪽이나 오른쪽 방향으로만 이동할 수 있습니다. | 고유 경로.cpp |
0-1 배낭 문제: 당신이 도둑이고 방에 물건이 가득 차서 물건을 훔치고 싶다고 상상해 보십시오. 당신은 무게 W의 최대 용량을 감당할 수 있는 배낭을 가지고 있고, 그 가치가 최대가 되도록 배낭을 채우고 싶습니다. 지능적인 도둑이기 때문에 당신은 방에 있는 각 물건의 무게와 가치를 알고 있습니다. 가능한 최대 값을 얻고 용량 W까지만 채울 수 있도록 배낭을 어떻게 채우시겠습니까? | 0_1_knapsack_problem.cpp |
문제 | 해결책 |
---|---|
큐를 사용하여 트리의 반복적인 레벨 순서 순회 | levelOrderTraversalIterative.cpp, level_order_tree_traversal_iterative.py |
트리의 재귀적 레벨 순서 순회 | levelOrderTraversalRecursive.cpp, level_order_tree_traversal_recursive.py |
지그재그 트리 순회 | zigZagTraversal.cpp, zig_zag_traversal.py |
이진 검색 트리에서 주어진 노드의 선행자와 후임자 | 전임자Successor.cpp |
이진 검색 트리에서 두 노드의 값이 주어지면 LCA(최저 공통 조상)를 찾습니다. 두 값이 모두 트리에 존재한다고 가정합니다. | 가장 낮은 공통-ancestor.cpp, 가장 낮은_common_ancestor.py |
(이진 검색 트리와는 달리) 이진 트리가 주어지면 LCA(최저 공통 조상)를 찾습니다. | 가장 낮은 공통 조상-이진-tree.cpp |
이진 트리가 주어지면 모든 루트-리프 경로를 한 줄에 하나씩 인쇄합니다. | printAllRootToLeafPath.cpp |
트리가 합계 트리인지 확인합니다. SumTree는 노드의 값이 왼쪽 하위 트리와 오른쪽 하위 트리에 있는 노드의 합과 동일한 이진 트리입니다. 빈 트리는 SumTree이고 빈 트리의 합은 0으로 간주될 수 있습니다. 리프 노드도 SumTree로 간주됩니다. | sumTree.cpp |
각 노드가 원래 트리의 왼쪽 및 오른쪽 하위 트리의 합이 되도록 트리를 sumTree로 변환합니다. | 변환_to_sum_tree.cpp, 변환_to_sum_tree.py |
정렬된 배열을 균형 이진 검색 트리로 변환합니다. | sortedArrayToBST.cpp |
이진 트리가 주어지면 각 수직 열의 합을 생성합니다. | 수직합.cpp |
이진 트리와 키가 주어지면 키를 가진 노드가 트리에 존재합니다. 키가 있는 노드의 모든 조상을 찾으십시오. 여기서 조상은 노드에서 루트까지 직선 경로에 있는 노드입니다. | node_ancestors_in_root_path.cpp |
이진 트리와 키가 주어지면 키가 있는 노드의 수준을 반환합니다. 루트는 레벨 1이고, 키를 가진 노드가 트리에 없으면 0을 반환합니다. | level_of_node.cpp |
이진 트리가 주어지면 루트에서 노드까지의 모든 경로를 찾으십시오. 그 합은 k입니다. | k_sum_paths.cpp |
이진 트리가 주어지면 해당 노드를 역순으로 레벨별로 인쇄합니다. 즉, 마지막 레벨에 있는 모든 노드가 먼저 인쇄되어야 하고 그 다음 마지막 두 번째 레벨의 노드가 인쇄되어야 합니다. 모든 레벨의 모든 노드는 왼쪽에서 오른쪽으로 인쇄되어야 합니다. | reverseLevelOrderTraversal.cpp |
재귀적이고 반복적으로 이진 트리를 반전시킵니다. | invert_a_tree.cpp |
이진 검색 트리가 주어지면 그 트리에서 주어진 키의 천장과 바닥을 찾습니다. 주어진 키가 BST에 있는 경우, Floor와 ceil은 모두 해당 키와 같습니다. 그렇지 않으면 ceil은 BST에서 다음으로 큰 키(있는 경우)와 같고, Floor는 BST에서 이전에 큰 키(있는 경우)와 같습니다. | Floor_ceil_bst.cpp |
이진 검색 트리에서 k번째로 작은 요소 찾기 | kth_smallest.cpp |
주어진 이진 트리가 이진 탐색 트리인지 검증합니다. | verify_bst.cpp |
이진 검색 트리와 대상 번호가 주어지면 BST에 해당 요소의 합이 주어진 대상과 동일한 두 개의 요소가 있으면 true를 반환합니다. | find_target_k.cpp |
비어 있지 않은 이진 검색 트리와 목표 값이 주어지면 BST에서 목표에 가장 가까운 값을 찾습니다. 또한 목표 값은 부동 소수점이라는 점에 유의하세요. 대상에 가장 가까운 고유 값은 하나만 있습니다. | 가장 가까운_bst_value.cpp, 가장 가까운_bst_value.py |
이진 트리가 주어지면 선주문을 순회하여 노드 값과 괄호를 포함하는 문자열 출력을 구성합니다. 널 노드는 빈 괄호 쌍 "()"으로 표시되어야 합니다. 그리고 문자열과 원래 이진 트리 간의 일대일 매핑 관계에 영향을 주지 않는 모든 빈 괄호 쌍을 생략해야 합니다. 코드 파일의 예 | string_from_tree.cpp |
문제 | 해결책 |
---|---|
문자열 검색을 위한 Robin-Karp 알고리즘 구현 | robinKarpStringMatching.cpp |
주어진 문자열의 다음 순열을 찾습니다. 즉, 주어진 문자열보다 사전순으로 더 큰 문자열이 되도록 주어진 문자열을 재배열합니다. | next_permutation.cpp |
패턴 매칭을 위한 Z 알고리즘 구현 | z.cpp |
자체 생성된 문자열 라이브러리에 대한 테스트 사례 | pstring_test.cpp |
문자열의 마지막 단어 길이를 구합니다. | length_of_last_word.cpp |
두 문자열의 차이점을 찾아보세요. 문자열 t는 문자열 s를 무작위로 섞은 후 임의의 위치에 문자를 하나 더 추가하여 생성됩니다. t에서 다른 문자를 결정합니다. | find_difference.cpp |
문제 | 해결책 |
---|---|
나선형 순서로 행렬의 내용을 인쇄합니다. | 매트릭스_나선_인쇄.cpp |
M x N 행렬이 주어지면 시계 반대 방향으로 R만큼 회전하고 결과 행렬을 표시합니다. | 회전_매트릭스.cpp |
r개 요소만큼 배열 회전(왼쪽 또는 오른쪽) | array_rotation.cpp |
반복/비반복 정수 배열이 주어지면 이 배열에서 첫 번째 비반복 정수를 결정합니다. | first_non_repeating_int.cpp |
Quantumland에는 1부터 n까지 번호가 매겨진 n개의 도시가 있습니다. 여기서 c i 는 i 번째 도시를 의미한다. Quantumland에는 n-1개의 도로가 있습니다. 여기서 c i 와 c i+1 은 각각 i < n에 대해 그들 사이에 양방향 도로를 가지고 있습니다. Flatland가 Quantumland를 공격할 것이라는 소문이 있고, 여왕은 자신의 땅을 안전하게 지키고 싶어합니다. c i 와 c i+1 사이의 도로는 c i 또는 c i+1 에 경비원이 있으면 안전합니다. 여왕은 이미 몇몇 도시에 경비병 몇 명을 배치했지만, 그들이 도로를 안전하게 지키기에 충분한지 확신할 수 없습니다. 그녀는 고용해야 하는 신규 경비원의 최소 수를 알고 싶어합니다. 입력/출력 세부정보는 솔루션의 설명을 참조하세요. | save_Quantamland.cpp |
정수 N이 주어졌습니다. 이 숫자에서 N(나머지가 0이 되는 나눗셈)을 정확하게 나누는 숫자를 찾아 그 수를 표시하십시오. N=24의 경우 2자리 숫자(2 & 4)가 있습니다. 이 두 숫자는 모두 정확히 24를 나눕니다. 따라서 답은 2입니다. 자세한 내용은 솔루션 파일의 헤더 주석을 참조하세요. | findDigits.cpp |
Caeser Cipher를 사용하여 텍스트를 암호화한 다음 해독합니다. | caeser_cipher.cpp |
Vigenère 암호를 사용하여 텍스트를 암호화한 다음 해독합니다. | vigenere_cipher.cpp |
1에서 N 사이의 이진수를 효율적으로 생성합니다. | n_바이너리.cpp |
전원 기능 구현 | power_function.cpp |
문제 | 해결책 |
---|---|
문자열의 모든 순열을 인쇄합니다. 예: ABC의 순열은 ABC, ACB, BCA, BAC, CAB, CBA입니다. | 문자열_순열.cpp |
두 숫자의 최대 공약수를 찾는 유클리드 알고리즘입니다. (반복 및 재귀) | gcd.cpp |
분할 정복 접근법을 사용하여 pow(x,y)를 구현합니다. O(logn)으로 구현해 보세요. | pow.cpp |
100과 같은 큰 숫자의 계승을 계산합니다(158자리가 됩니다). | factorial_of_large_num.cpp |
기존 모바일 키패드에 입력된 숫자에서 가능한 모든 단어를 생성합니다. | 전화_숫자.cpp |
숫자의 문자열 표현이 주어지면 숫자 표현이 가능한 가장 낮도록 문자열에서 n자를 제거합니다. | 가장 낮은_가능한_번호.cpp |
숫자가 행복한 숫자인지 감지합니다. 숫자를 숫자의 제곱합으로 대체한 일련의 연산이 결국 1이 되면 숫자는 행복한 숫자입니다. 위의 연산이 수행될 때 무한 루프에 빠지면 숫자는 행복한 숫자가 아닙니다. | happy_number.cpp |
문제 | 해결책 |
---|---|
우리는 주식에 대한 일련의 n개의 일일 가격 견적을 가지고 있습니다. n일 전체에 대한 주가 범위를 계산해야 합니다. i번째 날의 범위는 주식 가격이 i번째 날 이하인 연속 최대 일수로 정의됩니다. 주식 시세 {100, 60, 70, 65, 80, 85}의 경우 범위는 {1, 1, 2, 1, 4, 5}입니다. 1일차의 스팬은 항상 1이고, 이제 2일차의 주식은 60이고, 그 이전에는 주식이 60 미만이었던 날이 없습니다. 따라서 스팬은 1로 유지됩니다. 3일차의 주식 가격은 70이므로 그 스팬은 1입니다. 2이고 전날과 마찬가지로 60이었습니다. | stock_span_problem.cpp |
중위 표현식이 주어지면 후위 표현식으로 변환합니다. 예: (A+B)*C --> AB+C* | infix_to_postfix.cpp |
문자 '(', ')', '{', '}', '[' 및 ']'만 포함된 문자열이 주어지면 입력 문자열이 유효한지 확인합니다. 괄호는 올바른 순서로 닫혀야 합니다. "( )" 및 "()[]{}"는 모두 유효하지만 "(]" 및 "([)]"는 유효하지 않습니다. | 유효한_괄호.cpp |
문제 | 해결책 |
---|---|
정렬된 벡터가 주어지면 벡터에서 값이 나타나는 첫 번째 인덱스를 반환하고, 숫자가 존재하지 않으면 -1을 반환합니다. | first_occurrence_binary_search.cpp |
정수 배열에서 첫 번째 반복 요소를 찾습니다. 정수 배열이 주어지면 그 배열에서 첫 번째 반복 요소를 찾으세요. 두 번 이상 발생하고 첫 번째 발생 인덱스가 가장 작은 요소를 찾아야 합니다. | 첫 번째RepeatingElement.cpp |
정렬되지 않은 정수 목록 A={a 1 ,a 2 ,…,a N }이 주어졌을 때, 그들 사이의 절대차가 가장 작은 요소 쌍을 찾으십니까? 쌍이 여러 개인 경우 모두 찾으십시오. | 가장 가까운_번호.cpp |
정렬된 배열이 주어지면 이 배열의 고정 소수점 인덱스를 결정합니다. 배열에 고정 소수점이 없으면 -1을 반환합니다. 요소의 인덱스가 인덱스와 같을 때 배열은 고정 소수점을 갖습니다. 즉, i == arr[i], 예상 시간 복잡도 O(logn) | 고정점.cpp |
배열에서 처음에는 증가하고 다음에는 감소하는 최대 요소를 찾습니다. 입력: arr[] = {8, 10, 20, 80, 100, 200, 400, 500, 3, 2, 1}, 출력: 500. 배열은 엄격하게 증가하거나 감소할 수도 있습니다. 예상 시간 복잡도는 O(logn)입니다. | findMaximum.cpp |
양수 및/또는 음수 배열이 주어지면 배열에서 합이 0에 가장 가까운 쌍을 찾으세요. | findClosestPairToZero.cpp |
예술가인 Numeros는 두 개의 목록 A와 B를 가지고 있었고 B는 A의 순열이었습니다. Numeros는 이 목록을 매우 자랑스럽게 생각했습니다. 안타깝게도 한 전시장에서 다른 전시장으로 옮기는 과정에서 A에서 일부 숫자가 빠졌습니다. 누락된 숫자를 찾을 수 있나요? 참고:
| 누락번호.cpp |
두 개의 정렬된 배열에서 가장 가까운 쌍을 찾습니다. 두 개의 정렬된 배열과 숫자 x가 주어지면 합이 x에 가장 가깝고 쌍이 각 배열의 요소를 갖는 쌍을 찾습니다. 두 개의 배열 ar1[0…m-1] 및 ar2[0..n-1]과 숫자 x가 주어지면 (ar1의 절대값이 되도록 ar1[i] + ar2[j] 쌍을 찾아야 합니다. [i] + ar2[j] – x)가 최소입니다. | 가장 가까운PairSorted.cpp |
n개 요소로 구성된 배열 A가 주어지면 A[i]^2 + A[j]^2 = A[K]^2가 되는 세 개의 인덱스 i, j 및 k를 찾습니다. O(n2) 시간복잡도와 O(1) 공간복잡도 | squareSum.cpp |
크기 n의 정렬되지 않은 배열 arr[0..n-1]이 주어지면 이 하위 배열을 정렬하면 전체 배열이 정렬되는 최소 길이 하위 배열 arr[s..e]를 찾습니다. | minLengthUnsortedArray.cpp |
산술 진행에서 누락된 숫자 찾기 | 누락번호2.cpp |
3개의 정렬된 벡터에서 공통 요소 찾기 | commonIn3Arrays.cpp |
정렬되지 않은 배열/벡터에서 주어진 합계를 가진 모든 쌍을 찾습니다. | find_pairs_with_sum.cpp |
배열이 주어지면 그 안에 있는 피크 요소를 찾으세요. 피크 요소는 이웃 요소보다 큰 요소입니다. | peak_element.cpp |
음이 아닌 별개의 정수로 구성된 정렬된 배열이 주어지면 그 배열에서 누락된 가장 작은 요소를 찾습니다. | 가장 작은_missing.cpp |
벡터의 모든 0을 끝으로 이동 | move_zeros.cpp |
문제 | 해결책 |
---|---|
그래프의 깊이 우선 순회 | dfsDemo.cpp |
그래프의 너비 우선 순회 | bfsDemo.cpp |
Dijkstra 알고리즘을 사용하여 시작 위치(노드 S)에서 그래프의 다른 모든 노드까지의 최단 거리를 계산합니다. | dijkstra-최단 도달 범위.cpp |
Prim의 알고리즘을 사용하여 주어진 그래프의 최소 스패닝 트리의 총 가중치(MST를 형성하는 모서리 가중치의 합)를 계산합니다. | primsMST.cpp |
Kruskal 알고리즘을 사용하여 주어진 그래프의 최소 스패닝 트리(MST)를 인쇄합니다. | kruskalMST.cpp |
각 문자에 대한 허프만 인코딩을 테이블로 생성하는 프로그램을 만듭니다. | 허프만_encoding.cpp |
글자가 포함된 2D 보드에서 특정 단어를 검색합니다. 단어는 인접한 가로 또는 세로 셀을 순차적으로 탐색하여 구성할 수 있습니다. 단어를 구성하는 순서에서 같은 위치의 문자는 두 번 이상 사용할 수 없습니다. (예제는 파일 상단을 확인하세요.) | Grid_word_search.cpp |
2D 화면, 픽셀의 위치, 채울 색상의 새 값이 주어지면 픽셀의 색상과 인접한 모든(위, 아래, 왼쪽, 오른쪽) 동일한 색상의 픽셀을 새로운 색상으로 바꿉니다. 이는 MS-PAINT의 영역을 홍수로 채우는 것과 동일합니다(버킷 기호 기억). | 홍수_채우기.cpp |
문제 | 해결책 |
---|---|
두 개의 정수 배열 A와 B가 주어지며 각각 N개의 정수를 포함합니다. 배열의 요소 순서를 자유롭게 변경할 수 있습니다. 모든 i에 대해 A' i +B' i ≥ K가 되도록 A와 B에 가능한 순열 A', B'가 있습니까? 여기서 A' i는 배열 A'의 i 번째 요소를 나타내고 B' i는 다음을 나타냅니다. 배열 B'의 i 번째 요소입니다. | two_arrays.cpp |
존은 명령을 받고 있어요. i 번째 주문은 i 번째 고객이 t i 시간에 접수하고 처리하는 데 시간 이 걸립니다. 고객이 주문을 받는 순서는 무엇입니까? (솔루션 댓글에서 자세한 내용을 확인하세요) | 주문_주문.cpp |
문제 | 해결책 |
---|---|
숫자 문자열(예: "1234", "567" 등)이 주어지면 전화/모바일 다이얼패드에서 볼 수 있는 매핑을 기반으로 이 숫자 문자열에서 생성할 수 있는 가능한 모든 문자 조합을 제공하십시오. 구형 전화기에 SMS를 입력해 본 적이 있다면 아실 것입니다. 예를 들어 "1"은 "abc"에 매핑되고 2는 "def"에 매핑됩니다. 이미지를 참고하시면 됩니다..
| 다이얼패드_조합.cpp |
'?' 지원을 통해 와일드카드 패턴 일치 구현 & ' '.
| wild_card_matching.cpp |
2D 보드와 사전의 단어 목록이 주어지면 목록에서 보드에 있는 가능한 모든 단어를 찾으세요. (솔루션의 예를 확인하세요) | word_search.cpp |
문제 | 해결책 |
---|---|
중복 없이 정렬된 정수 배열이 주어지면 해당 범위의 요약을 반환합니다. 예를 들어, [0,1,2,4,5,7]이 주어지면 ["0->2","4->5","7"]을 반환합니다. | 요약_범위.cpp |
다음과 같은 속성을 갖는 2D 행렬이 주어지면
| search2DII.cpp |
정렬되지 않은 정수 배열이 주어지면 첫 번째 누락된 양의 정수를 찾습니다. 예: [1,2,0]은 3을 반환해야 하고 [3,4,-1,1]은 2를 반환해야 합니다. 예상 시간 복잡도는 O(n)이고 솔루션은 다음과 같습니다. 일정한 공간을 사용하다 | firstMissingPositiveNum.cpp |
정렬되지 않은 정수 배열이 주어지면 가장 긴 연속 요소 시퀀스의 길이를 찾습니다. 예를 들면 다음과 같습니다. [100, 4, 200, 1, 3, 2]. 가장 긴 연속 요소 시퀀스는 [1, 2, 3, 4]입니다. 길이를 반환합니다: 4. 알고리즘은 O(n) 복잡도에서 실행되어야 합니다. | 가장 긴ConsecutiveSeq.cpp |
두 개의 정렬된 정수 배열 nums1 및 nums2가 주어지면 nums2를 하나의 정렬된 배열로 nums1에 병합합니다. nums1에는 nums2의 추가 요소를 보유할 만큼 충분한 공간(m + n보다 크거나 같은 크기)이 있다고 가정할 수 있습니다. nums1과 nums2에서 초기화된 요소의 개수는 각각 m과 n입니다. | mergeArrays.cpp |
음수가 아닌 정수 배열이 주어지면 처음에는 배열의 첫 번째 인덱스에 위치하게 됩니다. 배열의 각 요소는 해당 위치에서의 최대 점프 길이를 나타냅니다. 마지막 인덱스에 도달할 수 있는지 확인합니다. 예를 들어:
| 점프게임.cpp |
양의 정수가 주어지면 Excel 시트에 나타나는 해당 열 제목을 반환합니다. 예를 들어 1 -> A, 2 -> B,...26 -> Z, 27 -> AA, 28 -> AB, ...705 -> AAC | excelColSheetTitle.cpp |
nums 배열이 주어지면 0이 아닌 요소의 상대적 순서를 유지하면서 모든 0을 끝으로 이동하는 함수를 작성합니다. 예를 들어 nums = [0, 1, 0, 3, 12]인 경우 함수를 호출한 후 nums는 [1, 3, 12, 0, 0]이어야 합니다. | moveZeroes.cpp |
정수 배열이 주어지면 배열에 중복된 항목이 포함되어 있는지 확인합니다. 함수는 배열에 값이 두 번 이상 나타나는 경우 true를 반환해야 하며, 모든 요소가 고유한 경우 false를 반환해야 합니다. | 포함Duplicate.cpp |
목록이 주어지면 목록을 오른쪽으로 k만큼 회전합니다. 여기서 k는 음수가 아닙니다. 예를 들어:
| 회전 목록.cpp |
word1과 word2라는 두 단어가 주어지면 word1을 word2로 변환하는 데 필요한 최소 단계 수를 찾습니다. (각 작업은 1단계로 계산됩니다.) 한 단어에 대해 다음과 같은 3가지 작업이 허용됩니다.
| editDistance.cpp |
이진 트리가 주어지면 다음 오른쪽 노드를 가리키도록 각 다음 포인터를 채웁니다. 다음 오른쪽 노드가 없으면 다음 포인터는 NULL로 설정되어야 합니다. 처음에는 모든 다음 포인터가 NULL로 설정됩니다. 일정한 추가 공간만 사용할 수 있습니다. 완벽한 이진 트리라고 가정할 수 있습니다(즉, 모든 리프가 동일한 수준에 있고 모든 부모가 두 개의 자식을 가짐). | connectNextPointers.cpp |
n 쌍의 괄호가 주어지면 올바른 형식의 괄호 조합을 모두 생성하는 함수를 작성하세요. 예를 들어, n = 3인 경우, 해 집합은 "((()))", "(()())", "(())()", "()(())", "( )()()" | 생성_괄호.cpp |
0, 1, 2, ..., n에서 가져온 n개의 고유 숫자를 포함하는 배열이 주어지면 배열에서 누락된 숫자를 찾습니다. 예를 들어 주어진 nums = [0, 1, 3]은 2를 반환합니다. | 누락_번호.cpp |
정렬된 배열이 미리 알려지지 않은 일부 피벗에서 회전한다고 가정합니다. (즉, 0 1 2 4 5 6 7은 4 5 6 7 0 1 2가 될 수 있습니다). 최소 요소를 찾으십시오. 배열에 중복된 내용이 없다고 가정할 수도 있습니다. | find_min_rotated.cpp |
n개의 정수로 구성된 배열 S가 주어지면 합계가 주어진 숫자인 target에 가장 가까운 S에서 세 개의 정수를 찾습니다. 세 정수의 합을 반환합니다. 각 입력에는 정확히 하나의 솔루션이 있다고 가정할 수 있습니다. | threeSumClosest.cpp |
n 개의 음수가 아닌 정수 a 1 , a 2 , ..., an n 이 주어지면 각각은 좌표 (i, a i )의 점을 나타냅니다. n개의 수직선은 선 i의 두 끝점이 (i, a i )와 (i, 0)에 있도록 그려집니다. x축과 함께 용기를 형성하여 용기에 가장 많은 물이 포함되는 두 개의 선을 찾습니다. 참고: 용기를 기울여서는 안 됩니다. | maxArea.cpp |
0-9의 숫자만 포함하는 이진 트리가 주어지면 각 루트에서 리프까지의 경로는 숫자를 나타낼 수 있습니다. 예를 들어 숫자 123을 나타내는 루트-리프 경로 1->2->3이 있습니다. 모든 루트-리프 숫자의 총합을 구합니다. 솔루션 설명의 예 | sumRootToLeafNumbers.cpp |
i번째 요소가 i일의 특정 주식 가격인 배열이 있다고 가정해 보겠습니다. 최대 한 번의 거래만 완료하도록 허용된 경우(예: 주식을 한 주 구매하고 한 주 판매), 최대 이익을 찾는 알고리즘을 설계하십시오. | maxProfitStock.cpp |
음수가 아닌 숫자로 채워진 amxn 그리드가 주어지면 경로를 따라 모든 숫자의 합을 최소화하는 왼쪽 상단에서 오른쪽 하단까지의 경로를 찾습니다. 참고: 언제든지 아래 또는 오른쪽으로만 이동할 수 있습니다. | 최소경로.cpp |
음수가 아닌 숫자 n보다 작은 소수의 개수를 셉니다. | countPrimes.cpp |
1부터 9까지의 숫자만 사용할 수 있고 각 조합은 고유한 숫자 집합이어야 한다는 가정하에 숫자 n을 합산하는 k 숫자의 가능한 모든 조합을 찾습니다. 집합 내의 숫자가 오름차순으로 정렬되어 있는지 확인하세요. 예: k = 3, n = 9의 경우 결과는 [[1,2,6], [1,3,5], [2,3,4]]입니다. 마찬가지로 k = 3, n = 7의 경우 결과도 마찬가지입니다. [[1,2,4]]가 됩니다. | 조합Sum3.cpp |
음수가 아닌 정수 숫자가 주어지면 결과에 숫자가 하나만 있을 때까지 모든 숫자를 반복해서 더합니다. 예를 들어, num = 38이면 프로세스는 다음과 같습니다: 3 + 8 = 11, 1 + 1 = 2. 2는 숫자가 1개뿐이므로 반환합니다. 후속 조치: O(1) 런타임에서 루프/재귀 없이 수행할 수 있습니까? | addDigits.cpp |
셀 값이 0 또는 1인 행렬이 주어지면 (a1, b1)에서 (a2, b2)까지의 최단 경로 길이를 구합니다. 즉, 경로는 값이 1인 셀을 통해서만 구성되고 4로만 이동할 수 있습니다. 가능한 방향, 즉 왼쪽, 오른쪽, 위쪽 및 아래쪽. | 가장 짧은_경로_maze.cpp |
두 정수 사이의 해밍 거리는 해당 비트가 서로 다른 위치의 수입니다. 두 개의 정수 x와 y가 주어지면 해밍 거리를 계산합니다. | hamming_distance.cpp |
두 개의 이진 트리가 주어지고 그 중 하나를 다른 트리에 덮을 때 두 트리의 일부 노드가 겹치고 다른 트리는 그렇지 않다고 상상해 보세요. 이를 새로운 이진 트리로 병합해야 합니다. 병합 규칙은 두 노드가 겹치는 경우 노드 값을 병합된 노드의 새 값으로 합산하는 것입니다. 그렇지 않으면 NOT null 노드가 새 트리의 노드로 사용됩니다. | merge_trees.cpp |
문자열을 입력으로 받아 문자열의 모음만 바꾸는 함수를 작성하세요. | reverse_vowels.cpp |
문자열이 주어지면 문자 빈도에 따라 내림차순으로 정렬합니다. 예를 들면 다음과 같습니다.
| sortCharByFrequency.cpp |
Self를 제외한 배열의 곱. n > 1, nums인 n 정수 배열이 주어지면, 출력[i]가 nums[i]를 제외한 nums의 모든 요소의 곱과 동일하도록 배열 출력을 반환합니다. | 제품_제외_자기.cpp |
정렬된 배열이 주어지면 중복된 항목을 제거하고 새 길이를 반환합니다. 고유한 요소 크기를 넘어서는 배열에 무엇이 있는지는 중요하지 않습니다. O(1) 공간과 O(n) 시간 복잡도가 예상됩니다. | 제거_중복.cpp |
그리드에 있는 섬의 수를 셉니다. 1을 육지로, 0을 수역으로 나타내는 그리드가 주어지면 섬의 수를 결정합니다(자세한 내용은 문제 설명 참조). | count_islands.cpp |
데이터 스트림에서 중앙값을 찾습니다. 스트림에 숫자를 추가하기 위해 addNum을 지원하고 지금까지 본 현재 숫자의 중앙값을 반환하기 위해 findMedian을 지원하는 데이터 구조를 설계합니다. 또한 숫자 개수가 짝수이면 두 중간 요소의 평균을 반환하고, 그렇지 않으면 중앙값을 반환합니다. | median_stream.cpp |
입력 문자열을 유효하게 만들려면 유효하지 않은 괄호의 최소 수를 제거하십시오. 가능한 모든 결과를 반환합니다. 참고 : 입력 문자열에는 괄호 (및) 이외의 문자가 포함될 수 있습니다. | remove_invalid_parenthesis.cpp |
배열과 값이 주어지면 해당 값의 모든 인스턴스를 현장에서 제거하고 새 길이를 반환하십시오. 다른 배열에 대한 추가 공간을 할당하지 마십시오. O (1) 추가 메모리로 입력 배열을 수정하여이를 수행해야합니다. 요소 순서를 변경할 수 있습니다. 새 길이를 넘어서 무엇을 남겨 두는지는 중요하지 않습니다. | remove_element.cpp |
두 개의 벡터가 상호 작용의 결과를 발견하면 두 배열/벡터의 교차점을 찾으십시오. 결과에는 고유 한 문자 만 포함되어야하며 순서대로 할 수 있습니다. | intersection_of_array.cpp |
패턴과 문자열 str가 주어지면 STR이 동일한 패턴을 따르는 지 찾으십시오. 여기서 다음은 패턴의 문자와 str의 비어 있지 않은 단어 사이에 biejection이 있도록 전체 일치를 의미합니다. 예: | |
Pattern = "abba", str = "Dog Cat Dog"는 True를 반환해야합니다. | |
Pattern = "abba", str = "개 고양이 물고기"는 거짓을 반환해야합니다. | |
Pattern = "aaaa", str = "Dog Cat Dog"는 False를 반환해야합니다. | |
Pattern = "Abba", str = "Dog Dog Dog Dog"는 False를 반환해야합니다. | Word_pattern.cpp |
당신은 숫자의 벡터가 제공되며 각 숫자는 | |
ith day에 주식의 가격. 완료되도록 허용되는 경우 | |
하루에 한 번의 거래 (예 : 하나를 구매하고 하나의 주식을 판매), 디자인 | |
최대 이익을 찾는 알고리즘. | best_time_to_buy_sell.cpp |
문장이 주어지면 문장 내에서 각 단어에서 문자 순서를 반전하면서 여전히 공백과 초기 단어 순서를 보존하십시오. | |
예: | |
입력 : 그녀는 초콜릿을 좋아합니다 | |
출력 : EHS Sevol etalocohc | reverse_words.cpp |