Leetcode In Golang
LeetCode Problems' Solutions
LeetCode Problems
1. Two Sum
題意:給出一個數組(數字不重複)和目標值,輸出陣列元素和為目標值的兩個元素的下標,當且僅當只有一個解。
思路:
1.暴力演算法 兩層for迴圈計算目標值 時間複雜度O(N^2) 空間複雜度O(1)
2.使用雜湊表 通過雜湊表查值 時間複雜度O(N) 空間複雜度O(N)
3.雙指標 時間複雜度O(N^2) 空間複雜度O(1)
程式碼:
暴力演算法 func twoSum(nums []int, target int) []int { for i := 0; i < len(nums); i++ { for j := i + 1; j < len(nums); j++ { if nums[i]+nums[j] == target { res := []int{i, j} return res } } } return nil } 雜湊表 func twoSum(nums []int, target int) []int { dict := make(map[int]int) for i := 0; i < len(nums); i++ { if v, ok := dict[nums[i]]; ok { res := []int{v, i} return res } dict[target-nums[i]] = i } return nil } 雙指標 func twoSum(nums []int, target int) []int { i, j := 1, 0 slice := make([]int, 0, 2) for { if nums[i]+nums[j] == target { slice = append(slice, j) slice = append(slice, i) return slice } i++ if i == len(nums) { j++ i = j + 1 } if j == len(nums) { return slice } } }
13. Roman to Integer
題意:給出一個羅馬字串,輸出羅馬字元和。
思路:
1.暴力演算法 switch case或者if計算總和 時間複雜度O(N) 空間複雜度O(1)
2.找規律 如果i+1的字元大於i先把i對應的值減去然後加上i+1的值 時間複雜度O(N) 空間複雜度O(1)
程式碼:
暴力演算法 func romanToInt(s string) int { tmpMap := map[string]int{"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000} score := 0 for i := 0; i < len(s); i++ { if i != len(s)-1 && string(s[i]) == "I" && string(s[i+1]) == "V" { score += 4 i++ } else if i != len(s)-1 && string(s[i]) == "I" && string(s[i+1]) == "X" { score += 9 i++ } else if i != len(s)-1 && string(s[i]) == "X" && string(s[i+1]) == "L" { score += 40 i++ } else if i != len(s)-1 && string(s[i]) == "X" && string(s[i+1]) == "C" { score += 90 i++ } else if i != len(s)-1 && string(s[i]) == "C" && string(s[i+1]) == "D" { score += 400 i++ } else if i != len(s)-1 && string(s[i]) == "C" && string(s[i+1]) == "M" { score += 900 i++ } else { score += tmpMap[string(s[i])] } } return score } 找規律 func romanToInt(s string) int { score := 0 dict := map[rune]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000} res := []rune(s) for i := 0; i < len(s)-1; i++ { if dict[res[i]] < dict[res[i+1]] { score -= dict[res[i]] } else { score += dict[res[i]] } } score += dict[res[len(s)-1]] return score }
344. Reverse String
題意:給出一個字串,輸出翻轉字串後結果
思路:
1.暴力演算法 for迴圈交換值 時間複雜度O(N) 空間複雜度O(N)
程式碼:
暴力演算法 func reverseString(s string) string { res := []rune(s) for i := 0; i < len(s)/2; i++ { res[i], res[len(s)-i-1] = res[len(s)-i-1], res[i] } return string(res) }
532. K-diff Pairs in an Array
題意:給出一個數組和數字k找出陣列中差為k的數字對數目
思路:
1.雙指標(慢速) 先排序,然後通過巢狀雜湊表來查詢數字對 時間複雜度O(N^2) 空間複雜度O(N)
2.雜湊表 時間複雜度O(N) 空間複雜度O(N)
程式碼:
雙指標 func findPairs(nums []int, k int) int { zeroCount, count, l, r := 0, 0, 0, 1 if len(nums) == 0 || k < 0 { return 0 } for i := 0; i < len(nums); i++ { if nums[i] == 0 { zeroCount++ } } if zeroCount == len(nums) && k == 0 && len(nums) > 1 { return 1 } else if zeroCount == len(nums) && k == 0 { return 0 } dict := make(map[int]map[int]bool) sort.Ints(nums) for { if r > len(nums)-1 { break } if nums[r]-nums[l] == k || nums[l]-nums[r] == k { if !dict[nums[r]][nums[l]] && !dict[nums[l]][nums[r]] { pairs := make(map[int]bool) pairs[nums[l]] = true dict[nums[r]] = pairs pairs[nums[r]] = true dict[nums[l]] = pairs //dict[nums[r]][nums[l]] = true //dict[nums[l]][nums[r]] = true count++ } } r++ if r > len(nums)-1 { l++ r = l + 1 } if l > len(nums)-1 { break } } return count } 雜湊表 func findPairs(nums []int, k int) int { if k < 0 { return 0 } res := 0 dict := make(map[int]int) for i := 0; i < len(nums); i++ { dict[nums[i]]++ } for key,_ := range dict { v := dict[key+k] if k == 0 && v == 1 || v == 0 { continue } res++ } return res }
682. Baseball Game
題意:給出一個字元陣列,根據字元功能要求,輸出得分結果
思路:
1.棧模擬 時間複雜度O(N) 空間複雜度O(N)
程式碼:
棧模擬 func calPoints(ops []string) int { var score int slice := make([]string, 0, len(ops)) for i, j := 0, -1; i < len(ops); i++ { switch ops[i] { case "C": num, _ := strconv.Atoi(slice[j]) score -= num slice = append(slice[:j]) j-- case "D": num, _ := strconv.Atoi(slice[j]) score += num * 2 t := strconv.Itoa(num * 2) slice = append(slice, t) j++ case "+": a, _ := strconv.Atoi(slice[j]) b, _ := strconv.Atoi(slice[j-1]) score = score + a + b num := strconv.Itoa(a + b) slice = append(slice, num) j++ default: num, _ := strconv.Atoi(ops[i]) score += num slice = append(slice, ops[i]) j++ } } return score }
832. Flipping an Image
題意:給出一個多維陣列A,每個元素內先左右翻轉,然後每行翻轉
思路:
1.暴力 每行元素翻轉,再每行翻轉 時間複雜度O(N^2) 空間複雜度O(N)
程式碼:
暴力 func flipAndInvertImage(A [][]int) [][]int { for i := 0; i < len(A); i++ { for j := 0; j < len(A)/2; j++ { t := A[i][j] A[i][j] = A[i][len(A)-j-1] A[i][len(A)-j-1] = t } } for i := 0; i < len(A); i++ { for j := 0; j < len(A); j++ { A[i][j] = A[i][j] ^ 1 } } return A }
844. Backspace String Compare
題意:給出兩個字串S和T,#為退格鍵,然後輸出最後的兩個字串結果是否相等
思路:
1.棧模擬 遇到#就彈棧 時間複雜度O(N) 空間複雜度O(N)
程式碼:
棧模擬 func backspaceCompare(S string, T string) bool { s := make([]string, 0, 200) t := make([]string, 0, 200) for i, j := 0, 0; i < len(S); i++ { if string(S[i]) == "#" && j > 0 { s = append(s[:j-1]) j-- } else if string(S[i]) != "#" { s = append(s, string(S[i])) j++ } } for i, j := 0, 0; i < len(T); i++ { if string(T[i]) == "#" && j > 0 { t = append(t[:j-1]) j-- } else if string(T[i]) != "#" { t = append(t, string(T[i])) j++ } } S = strings.Join(s, "") T = strings.Join(t, "") if S == T { return true } return false }
905. Sort Array By Parity
題意:給出一個非負陣列A,輸出任意所有偶數在前所有奇數在後的結果
思路:
1.暴力 時間複雜度O(N) 空間複雜度O(1)
程式碼:
func sortArrayByParity(A []int) []int { tmp := 0 for i, j := 0, 0; i < len(A); i++ { if A[i]%2 == 0 { tmp = A[j] A[j] = A[i] A[i] = tmp j++ } } return A }