File tree Expand file tree Collapse file tree 10 files changed +221
-0
lines changed
longest-consecutive-sequence Expand file tree Collapse file tree 10 files changed +221
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number[] } nums
3
+ * @return {boolean }
4
+ */
5
+ var containsDuplicate = function ( nums ) {
6
+
7
+ // 첫 번째 방법: filter + indexOf 사용 => indexOf(),filter() 각각 시간복잡도 O(n) 두 개가 중첩이므로 시간복잡도 O(n^2)
8
+ // Runtime: Time Limit Exceeded 발생
9
+ const method1 = function ( ) {
10
+ const filterNums = nums . filter ( ( item , index ) => nums . indexOf ( item ) !== index ) ;
11
+ return filterNums . length > 0 ;
12
+ }
13
+
14
+ // 두 번째 방법: Set 사용 => nums 배열을 set으로 변환할 때 한번씩 확인하면 되므로 시간복잡도 O(n)
15
+ // Runtime: 14ms
16
+ const method2 = function ( ) {
17
+ const setNums = new Set ( nums ) ;
18
+ return setNums . size !== nums . length ;
19
+ }
20
+
21
+ // 위 두 가지 방법 중 Set을 사용하는 것이 성능상 훨씬 나음
22
+ return method2 ( ) ;
23
+ } ;
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def containsDuplicate (self , nums : List [int ]) -> bool :
3
+ return len (nums ) != len (set (nums ))
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number[] } nums
3
+ * @return {number }
4
+ */
5
+ var rob = function ( nums ) {
6
+ // 1. nums 배열 0일 때와 1일 때
7
+ if ( nums . length === 0 ) return 0 ;
8
+ if ( nums . length === 1 ) return nums [ 0 ] ;
9
+
10
+ // 2. i=1일 때
11
+ nums [ 1 ] = Math . max ( nums [ 0 ] , nums [ 1 ] ) ;
12
+
13
+ // 3. i=2일 때부터 for문 순회
14
+ for ( let i = 2 ; i < nums . length ; i ++ ) {
15
+ nums [ i ] = Math . max ( nums [ i - 2 ] + nums [ i ] , nums [ i - 1 ] )
16
+ }
17
+ return nums [ nums . length - 1 ] ;
18
+ } ;
19
+
20
+ // 시간복잡도와 공간복잡도
21
+ // 시간복잡도: 배열의 길이 n 만큼 for문 순회하므로 -> O(n)
22
+ // 공간복잡도: nums 배열 그대로 수정하여 계산 -> O(1)
Original file line number Diff line number Diff line change
1
+ from typing import List
2
+
3
+ class Solution :
4
+ def rob (self , nums : List [int ]) -> int :
5
+ if len (nums ) == 1 :
6
+ return nums [0 ]
7
+
8
+ # prev1: 이전 집까지의 최대 이익
9
+ # prev2: 전전 집까지의 최대 이익
10
+ prev1 , prev2 = 0 , 0
11
+ for num in nums :
12
+ temp = prev1
13
+ prev1 = max (prev2 + num , prev1 ) # 현재 집을 털었을 때와 안 털었을 때 중 더 큰 이익 선택
14
+ prev2 = temp
15
+
16
+ return prev1
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number[] } nums
3
+ * @return {number }
4
+ */
5
+ var longestConsecutive = function ( nums ) {
6
+ // 첫 번째 정렬을 한다.
7
+ if ( nums . length === 0 ) {
8
+ return 0 ;
9
+ }
10
+
11
+ nums . sort ( ( a , b ) => a - b ) ; // 오름차순으로 정렬
12
+ console . log ( nums ) ;
13
+
14
+ // 두 번째 숫자가 1씩 계속해서 증가하는 구간을 찾는다.
15
+ let longest = 0 ;
16
+ let length = 1 ;
17
+
18
+ for ( let i = 0 ; i < nums . length - 1 ; i ++ ) {
19
+ if ( nums [ i ] === nums [ i + 1 ] ) {
20
+ continue ;
21
+ }
22
+ // 연속해서 1씩 증가하는 구간 찾기
23
+ if ( nums [ i + 1 ] - nums [ i ] === 1 ) {
24
+ length += 1 ;
25
+ } else {
26
+ longest = Math . max ( longest , length ) ;
27
+ length = 1 ;
28
+ }
29
+ }
30
+ return Math . max ( longest , length ) ;
31
+ } ;
32
+
33
+ // 시간복잡도와 공간복잡도
34
+ // 시간복잡도: 정렬 사용(O(nlogn)) + for문으로 배열 탐색(O(n)) = O(nlogn)
35
+ // 공간복잡도: O(1)
Original file line number Diff line number Diff line change
1
+ from typing import List
2
+
3
+ class Solution :
4
+ def longestConsecutive (self , nums : List [int ]) -> int :
5
+ # Convert to set for O(1) lookups
6
+ num_set = set (nums )
7
+ longest_length = 0
8
+
9
+ for num in num_set :
10
+ # Only start counting if num is the start of a sequence
11
+ if num - 1 not in num_set :
12
+ current_num = num
13
+ current_length = 1
14
+
15
+ # Count the length of the sequence
16
+ while current_num + 1 in num_set :
17
+ current_num += 1
18
+ current_length += 1
19
+
20
+ longest_length = max (longest_length , current_length )
21
+
22
+ return longest_length
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number[] } nums
3
+ * @param {number } k
4
+ * @return {number[] }
5
+ */
6
+ var topKFrequent = function ( nums , k ) {
7
+ let map = new Map ( ) ; // key에는 해당되는 숫자, value에는 해당되는 숫자의 갯수
8
+
9
+ // 숫자별 빈도수
10
+ nums . forEach ( ( num ) => {
11
+ map . set ( num , ( map . get ( num ) || 0 ) + 1 ) ;
12
+ } ) ;
13
+
14
+ // 결과를 배열로 바꿔주고 내림차순 정렬
15
+ let sortedResult = Array . from ( map . entries ( ) ) . sort ( ( a , b ) => b [ 1 ] - a [ 1 ] ) ;
16
+ //console.log(sortedResult);
17
+ //console.log(sortedResult.slice(0,k));
18
+
19
+ // k갯수의 숫자 반환
20
+ return sortedResult . slice ( 0 , k ) . map ( item => item [ 0 ] ) ;
21
+ } ;
22
+
23
+ // 여기서 위 코드의 시간복잡도와 공간복잡도를 생각해보자...
24
+ // 시간복잡도 => O(m log m) ** 더 개선할 방법 찾아보기
25
+ // forEach 통한 배열 순회: 배열의 크기가 n이라고 한다면 O(n)
26
+ // sortedResult (정렬): O(m log m)
27
+ // k갯수의 숫자 반환: k개 항목에 대해 연산하니까 O(k)
28
+
29
+ // 공간복잡도 => O(n)
30
+ // map의 크기: 배열의 크기가 n이라고 한다면 O(n)
31
+ // sortedResult: O(m)
32
+ // k개 숫자 저장: O(k)
Original file line number Diff line number Diff line change
1
+ from collections import Counter
2
+ from typing import List
3
+
4
+ class Solution :
5
+ def topKFrequent (self , nums : List [int ], k : int ) -> List [int ]:
6
+ # 빈도 계산
7
+ count = Counter (nums )
8
+ n = len (nums )
9
+
10
+ # 빈도수를 기준으로 버킷 생성 (0에서 n까지)
11
+ buckets = [[] for _ in range (n + 1 )]
12
+
13
+ # 각 숫자를 해당 빈도수의 버킷에 추가
14
+ for num , freq in count .items ():
15
+ buckets [freq ].append (num )
16
+
17
+ # 빈도가 높은 순서대로 k개의 숫자를 추출
18
+ result = []
19
+ for freq in range (n , 0 , - 1 ):
20
+ if buckets [freq ]:
21
+ result .extend (buckets [freq ])
22
+
23
+ if len (result ) == k :
24
+ return result
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {string } s
3
+ * @return {boolean }
4
+ */
5
+ var isPalindrome = function ( s ) {
6
+ // 1. 문자열을 다 소문자로 바꾸고, 알파벳/숫자 아닌 거 다 제거
7
+ if ( s . length === 1 ) {
8
+ return true ;
9
+ } else {
10
+ let lcLetter = s . toLowerCase ( ) . replace ( / [ ^ a - z 0 - 9 ] / g, '' ) ;
11
+ //console.log(lcLetter);
12
+
13
+ // 2. 문자열이 앞에서 시작할 때와 뒤에서 시작할 때 같으면 true, 아니면 false
14
+ if ( lcLetter ) {
15
+ for ( let i = 0 ; i < Math . floor ( lcLetter . length / 2 ) ; i ++ ) {
16
+ if ( lcLetter [ i ] !== lcLetter [ lcLetter . length - 1 - i ] ) return false ;
17
+ }
18
+ return true ;
19
+ } else {
20
+ return true ;
21
+ }
22
+ }
23
+ } ;
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def isPalindrome (self , s : str ) -> bool :
3
+ # two pointer
4
+ left , right = 0 , len (s ) - 1
5
+
6
+ while left < right :
7
+ # compare only alphanumeric characters
8
+ while left < right and not s [left ].isalnum ():
9
+ left += 1
10
+ while left < right and not s [right ].isalnum ():
11
+ right -= 1
12
+
13
+ # compare with lowercase
14
+ if s [left ].lower () != s [right ].lower ():
15
+ return False
16
+
17
+ # move pointers
18
+ left += 1
19
+ right -= 1
20
+
21
+ return True
You can’t perform that action at this time.
0 commit comments