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
}