Leetcode In Golang

LeetCode Problems' Solutions

LeetCode Problems

ID Title 中文名稱 Solutions Difficulty
1 Two Sum 兩數之和 C++ Go Easy
13 Roman to Integer 羅馬數字轉整數 C++ Go Easy
26 Remove Duplicates from Sorted Array 刪除排序數組中的重複項 C++ Go Easy
48 Rotate Image 旋轉圖像 C++ Go Medium
58 Length of Last Word 最後一個單詞長度 C++ Go Easy
66 Plus One 加一 C++ Go Easy
118 Pascal's Triangle 楊輝三角 C++ Go Easy
122 Best Time to Buy and Sell Stock II 買賣股票的最佳時機 II C++ Go Easy
125 Valid Palindrome 驗證迴文串 C++ Go Easy
136 Single Number 只出現一次的數字 C++ Go Easy
189 Rotate Array 旋轉數組 C++ Go Easy
217 Contains Duplicate 存在重複元素 C++ Go Easy
283 Move Zeroes 移動零 C++ Go Easy
344 Reverse String 反轉字符串 C++ Go Easy
496 Next Greater Element I 下一個更大元素 I C++ Go Medium
498 Diagonal Traverse 對角線遍歷 C++ Go Medium
724 Find Pivot Index 尋找數組的中心索引 C++ Go Easy
739 Daily Temperatures 每日溫度 C++ Go Medium
747 Largest Number At Least Twice of Others 至少是其他數字兩倍的最大數 C++ Go Easy
832 Flipping an Image 翻轉圖像 C++ Go Easy
905 Sort Array By Parity 按奇偶排序數組 C++ Go Easy
921 Minimum Add to Make Parentheses Valid 使括號有效的最少添加 C++ Go Medium
946 Validate Stack Sequences C++ Go Medium

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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章