File tree Expand file tree Collapse file tree 5 files changed +130
-0
lines changed
longest-consecutive-sequence Expand file tree Collapse file tree 5 files changed +130
-0
lines changed Original file line number Diff line number Diff line change 1+ // Time complexity, O(n)
2+ // Space complexity, O(n)
3+ // 풀이
4+ // nums 배열을 순회하면서 hashMap에 num을 key로, 존재 여부를 value로 저장한다.
5+ // 만약 이미 존재하는 key라면 true를 반환하고, 순회를 전부 했는데도 중복이 없다면 false를 반환한다.
6+ func containsDuplicate (nums []int ) bool {
7+ hashMap := map [int ]bool {}
8+ for _ , num := range nums {
9+ if hashMap [num ] {
10+ return true
11+ }
12+ hashMap [num ] = true
13+ }
14+ return false
15+ }
Original file line number Diff line number Diff line change 1+ // time complexity: O(n)
2+ // space complexity: O(1)
3+ func rob (nums []int ) int {
4+ prev := 0
5+ curr := 0
6+
7+ for _ , num := range nums {
8+ temp := curr
9+ curr = max (prev + num , curr )
10+ prev = temp
11+ }
12+
13+ return curr
14+ }
Original file line number Diff line number Diff line change 1+ // time complexity: O(n)
2+ // space complexity: O(n)
3+ // 풀이
4+ // 1. map에 nums의 모든 요소를 저장한다.
5+ // 2. map을 순회하면서 num-1이 존재하는지 확인한다.
6+ // 3. num-1이 존재하면 continue
7+ // 4. num-1이 존재하지 않으면 consecutiveCount를 1로 초기화하고 num+1이 존재하는지 (연속적으로 숫자가 증가하는게 있는지) 확인한다.
8+ // 5. num+1이 존재하면 consecutiveCount를 1 증가시키고 num을 1 증가시켜 다음 수를 찾는다.
9+ // 6. num+1이 존재하지 않으면 현재까지의 consecutiveCount와 maxConsecutiveCount를 비교하여 maxConsecutiveCount를 갱신한다.
10+ func longestConsecutive (nums []int ) int {
11+ numMap := make (map [int ]bool )
12+
13+ for _ , num := range nums {
14+ numMap [num ] = true
15+ }
16+
17+ maxConsecutiveCount := 0
18+
19+ for num := range numMap {
20+ if numMap [num - 1 ] {
21+ continue
22+ }
23+ consecutiveCount := 1
24+ for numMap [num + 1 ] {
25+ num ++
26+ consecutiveCount ++
27+ }
28+ if consecutiveCount > maxConsecutiveCount {
29+ maxConsecutiveCount = consecutiveCount
30+ }
31+ }
32+
33+ return maxConsecutiveCount
34+ }
Original file line number Diff line number Diff line change 1+ // Time: O(nlogn)
2+ // Space: O(n)
3+ // 풀이
4+ // hashMap에 num을 key로, count를 value로 저장한다.
5+ // hashMap을 배열로 만들어 count순으로 정렬한다.
6+ // 정렬된 배열에서 앞에서부터 k개만 뽑아내서 반환한다.
7+ func topKFrequent (nums []int , k int ) []int {
8+ hashMap := map [int ]int {}
9+ for _ , num := range nums {
10+ hashMap [num ]++
11+ }
12+
13+ result := [][]int {}
14+
15+ for num , count := range hashMap {
16+ result = append (result , []int {num , count })
17+ }
18+
19+ sort .Slice (result , func (i , j int ) bool { // go의 sort는 quicksort를 기본적으로 사용한다. O(nlogn)
20+ return result [i ][1 ] > result [j ][1 ]
21+ })
22+
23+ resultNums := make ([]int , 0 , k )
24+ for i := 0 ; i < k ; i ++ {
25+ resultNums = append (resultNums , result [i ][0 ])
26+ }
27+
28+ return resultNums
29+ }
Original file line number Diff line number Diff line change 1+ // 풀이
2+ // alphabet, number만 걸러내서 소문자로 바꾼 후 reverse한 문자열, 걸러낸 문자열과 비교하여 같은지 확인한다.
3+
4+ // O(n) time complexity
5+ // O(n) space complexity
6+ func isPalindrome (s string ) bool {
7+ regex , _ := regexp .Compile ("[a-zA-Z0-9]" )
8+
9+ lowerCaseString := strings .ToLower (s )
10+ reverseAndFilteredString := ""
11+ filteredString := ""
12+
13+ for _ , char := range lowerCaseString {
14+ if regex .MatchString (string (char )) {
15+ reverseAndFilteredString = c + reverseAndFilteredString
16+ filteredString += c
17+ }
18+ }
19+
20+ return reverseAndFilteredString == filteredString
21+ }
22+
23+ // O(n) time complexity
24+ // O(n) space complexity
25+ func isPalindrome2 (s string ) bool {
26+ lowerCaseString := strings .ToLower (s )
27+ reverseAndFilteredString := ""
28+ var filteredString strings.Builder
29+
30+ for _ , char := range lowerCaseString {
31+ if unicode .IsLetter (char ) || unicode .IsDigit (char ) {
32+ reverseAndFilteredString = string (char ) + reverseAndFilteredString
33+ filteredString .WriteRune (char )
34+ }
35+ }
36+
37+ return reverseAndFilteredString == filteredString .String ()
38+ }
You can’t perform that action at this time.
0 commit comments