티스토리 뷰
LeetCode Note #001
어렵지만 도전해볼 만한 문제가 있어 올려봅니다.
LeetCode의 136번 문제 "Single Number"입니다.
[ Description ]
int 자료형들의 배열이 주어지고, 단 하나의 원소를 제외한 나머지들은 두 번씩 나타납니다(중복된다는 뜻).
[ NOTE ]
알고리듬은 선형복잡도를 가져야합니다.
메모리를 추가로 사용하지않을 수 있습니까 ?
예시로, { 1, 3, 1, -1, 3 }이 입력되면 -1을 반환하면 됩니다.
보기에는 단순한 것 같지만, 알고 보면 쉽지않은 문제입니다.
아래는 Solution에 대한 설명이므로, 지금 보고 싶지않다면 내리지말아주세요.
[ Solution ]
방법 #1 - List operation [Time Limit Exceeded]
배열을 만들어, 그 배열에 원소를 집어넣고 삭제하는 연산을 반복합니다
알고리듬
- 입력 vector의 모든 원소에 대해 반복합니다.
- 지금 원소가 중복되는 것이 아닐 경우, 추가합니다.
- 지금 원소가 중복되는 경우, 삭제합니다.
복잡도 분석
- 시간 복잡도 :
O(n^2)
- 공간 복잡도 :
O(n)
→ 결국, "시간제한 초과(Time Limit Exceeded)"로 이어집니다.C++ 구현
int singleNumber(vector<int>& nums){// 정답vector<int> result;// 중복여부bool bDup;// 중복된 곳int dupIndex;for (auto i : nums){// 중복여부를 매번 초기화bDup = false;// 중복되는지 검사하고, 그럴 경우 그 위치와 중복여부를 저장for (int j = 0; j < result.size(); ++j){if (result[j] == i){dupIndex = j;bDup = true;}}// 중복될 경우, 정답에서 제외하고 그렇지않을 경우 정답에 추가if (bDup){result.erase(result.begin() + dupIndex);}else{result.push_back(i);}}// 중복된 값이 모두 제거되고 나면, 단 하나의 값만 남게되므로return result.back();}
방법 #2 - Hash Table [Accepted]
원소를 탐색하는 데 필요한 시간
O(n)
을 소비하지않기 위해 해쉬 테이블을 사용합니다알고리듬
복잡도 분석
C++ 구현
방법 #3 - Math [Accepted]
아직 작성 중입니다.
방법 #4 - Bit Manipulation [Accepted]
아직 작성 중입니다.
이상입니다.
'Computer Science > Algorithm' 카테고리의 다른 글
#002 : Count Binary Substrings (0) | 2017.10.17 |
---|
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- shader
- NOX
- windows
- CAFFE
- git
- pclaf
- A.I.
- Anaconda
- Game
- lib
- JIT
- WindowAPI
- C/C++
- tensorflow
- ATOM
- Docker
- csharp
- DirectX
- Hashtable
- dll
- Slack
- CUDA
- unity
- visual-studio
- cuDNN
- unreal
- Python
- vscode
- visualstudio
- PopeTV
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함