File tree 5 files changed +165
-0
lines changed
longest-consecutive-sequence
5 files changed +165
-0
lines changed Original file line number Diff line number Diff line change
1
+
2
+
3
+ # cpp stl
4
+ ``` cpp
5
+ class Solution {
6
+ public:
7
+ bool containsDuplicate(vector<int >& nums) {
8
+ set<int > numSet(nums.begin(), nums.end());
9
+ return numSet.size() != nums.size();
10
+ }
11
+ };
12
+ ```
13
+
14
+ - set으로 단순비교. 편리하나, 정렬에 비해 시간이 오래 걸림.
15
+ - unordered_set을 쓰면 set 방식에서 조금 더 빠를 수는 있음
16
+
17
+ ```cpp
18
+ class Solution {
19
+ public:
20
+ bool containsDuplicate(vector<int>& nums) {
21
+ sort(nums.begin(), nums.end());
22
+ for(int i=0;i<nums.size()-1;i++){
23
+ if(nums[i]==nums[i+1]){
24
+ return true;
25
+ }
26
+ }
27
+ return false;
28
+ }
29
+ };
30
+ ```
31
+
32
+ - 둘 다 O(n logn)의 시간 복잡도이나, 자료 특성 상 정렬이 더 빠름
33
+
34
+
35
+
36
+
37
+
Original file line number Diff line number Diff line change
1
+
2
+ ``` cpp
3
+ class Solution {
4
+ public:
5
+ int rob(vector<int >& nums) {
6
+ if(nums.size()==1)
7
+ return nums[ 0] ;
8
+
9
+ int res = max(nums[0], nums[1]);
10
+ vector<int> sav(nums.size(), 0);
11
+ sav[0] = nums[0];
12
+ sav[1] = res;
13
+ for(int i=2;i<nums.size();i++){
14
+ sav[i] = max(sav[i-1], sav[i-2]+nums[i]);
15
+ res = max(res, sav[i]);
16
+ }
17
+ return res;
18
+ }
19
+ };
20
+ ```
21
+
22
+ - 1차원 dp
23
+
24
+
Original file line number Diff line number Diff line change
1
+ ``` cpp
2
+ class Solution {
3
+ public:
4
+ int longestConsecutive(vector<int >& nums) {
5
+ if(nums.size()<=1){
6
+ return nums.size();
7
+ }
8
+ priority_queue<int > pq(nums.begin(), nums.end());
9
+ int cnt = 1;
10
+ int maxCnt = 1;
11
+ int before = pq.top();pq.pop();
12
+ while(pq.size()>0){
13
+ int cur = pq.top(); pq.pop();
14
+ if(before-cur ==1){
15
+ cnt++;
16
+ maxCnt = max(maxCnt, cnt);
17
+ }else if(before==cur){
18
+ continue;
19
+ }else{
20
+ maxCnt = max(maxCnt, cnt);
21
+ cnt=1;
22
+ }
23
+ before = cur;
24
+ }
25
+
26
+ return maxCnt;
27
+ }
28
+ };
29
+ ```
30
+
31
+ - 순서 유지 조건 없으므로, insert와 정렬을 동시에 할 수 있는 우선순위 큐 사용
32
+ - 전체 정렬이 필요할 경우 정렬이 더 유리할 수 있으나, 최적화 여지가 우선순위 큐가 더 커서 사용
33
+ - ex) 탐색 중단 조건 등
34
+
35
+
Original file line number Diff line number Diff line change
1
+ ``` cpp
2
+ class Solution {
3
+ public:
4
+ vector<int > topKFrequent(vector<int >& nums, int k) {
5
+ unordered_map<int, int> freqCntMp;
6
+ vector<vector<int >> v(nums.size()+1, vector<int >());
7
+ int maxSize = 0;
8
+ for(int i=0;i<nums.size();i++){
9
+ freqCntMp[ nums[ i]] +=1;
10
+ v[ freqCntMp[ nums[ i]]] .push_back(nums[ i] );
11
+ if(maxSize<freqCntMp[ nums[ i]] )
12
+ maxSize = freqCntMp[ nums[ i]] ;
13
+ }
14
+ for(int idx = maxSize;idx>0;idx--){
15
+ if(v[ idx] .size()==k){
16
+ return v[ idx] ;
17
+ }
18
+ }
19
+ return vector<int >();
20
+ }
21
+ };
22
+ ```
23
+
Original file line number Diff line number Diff line change
1
+ ## 단순 순회
2
+
3
+ ``` cpp
4
+ class Solution {
5
+ public:
6
+ vector<int > twoSum(vector<int >& nums, int target) {
7
+ int i=0,j=1;
8
+ for(i=0;i<j;i++){
9
+ for(j=i+1;j<nums.size();j++){
10
+ if(nums[ i] +nums[ j] ==target){
11
+ return {i, j};
12
+ }
13
+ }
14
+ }
15
+ return {0, 1};
16
+
17
+ }
18
+ };
19
+ ```
20
+
21
+ - O(n^2)
22
+
23
+ ## stl 사용
24
+
25
+ ``` cpp
26
+ class Solution {
27
+ public:
28
+ vector<int > twoSum(vector<int >& nums, int target) {
29
+ unordered_map<int, int> valIdxMap;
30
+
31
+ for(int idx=0;idx<nums.size();idx++){
32
+ if(valIdxMap.find(target-nums[ idx] ) != valIdxMap.end()){
33
+ return {idx, valIdxMap[ target-nums[ idx]] };
34
+ }
35
+ valIdxMap[ nums[ idx]] = idx;
36
+
37
+ }
38
+ return {0, 1};
39
+
40
+ }
41
+ };
42
+ ```
43
+
44
+ - O(nlogn)
45
+
46
+
You can’t perform that action at this time.
0 commit comments