mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 00:25:22 +08:00
FIX GO_LINT
This commit is contained in:
@ -1,6 +1,6 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
func reverse_7(x int) int {
|
func reverse7(x int) int {
|
||||||
tmp := 0
|
tmp := 0
|
||||||
for x != 0 {
|
for x != 0 {
|
||||||
tmp = tmp*10 + x%10
|
tmp = tmp*10 + x%10
|
||||||
|
@ -51,7 +51,7 @@ func Test_Problem7(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans7, q.para7
|
_, p := q.ans7, q.para7
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p.one, reverse_7(p.one))
|
fmt.Printf("【input】:%v 【output】:%v\n", p.one, reverse7(p.one))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ func threeSum(nums []int) [][]int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uniqNums := []int{}
|
uniqNums := []int{}
|
||||||
for key, _ := range counter {
|
for key := range counter {
|
||||||
uniqNums = append(uniqNums, key)
|
uniqNums = append(uniqNums, key)
|
||||||
}
|
}
|
||||||
sort.Ints(uniqNums)
|
sort.Ints(uniqNums)
|
||||||
|
@ -30,7 +30,7 @@ func threeSumClosest(nums []int, target int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 暴力解法 O(n^3)
|
// 解法二 暴力解法 O(n^3)
|
||||||
func threeSumClosest_(nums []int, target int) int {
|
func threeSumClosest1(nums []int, target int) int {
|
||||||
res, difference := 0, math.MaxInt16
|
res, difference := 0, math.MaxInt16
|
||||||
for i := 0; i < len(nums); i++ {
|
for i := 0; i < len(nums); i++ {
|
||||||
for j := i + 1; j < len(nums); j++ {
|
for j := i + 1; j < len(nums); j++ {
|
||||||
|
@ -10,7 +10,7 @@ func fourSum(nums []int, target int) [][]int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uniqNums := []int{}
|
uniqNums := []int{}
|
||||||
for key, _ := range counter {
|
for key := range counter {
|
||||||
uniqNums = append(uniqNums, key)
|
uniqNums = append(uniqNums, key)
|
||||||
}
|
}
|
||||||
sort.Ints(uniqNums)
|
sort.Ints(uniqNums)
|
||||||
|
@ -29,7 +29,7 @@ func removeNthFromEnd(head *ListNode, n int) *ListNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func removeNthFromEnd_(head *ListNode, n int) *ListNode {
|
func removeNthFromEnd1(head *ListNode, n int) *ListNode {
|
||||||
if head == nil {
|
if head == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -17,56 +17,7 @@ func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
|
|||||||
if l1.Val < l2.Val {
|
if l1.Val < l2.Val {
|
||||||
l1.Next = mergeTwoLists(l1.Next, l2)
|
l1.Next = mergeTwoLists(l1.Next, l2)
|
||||||
return l1
|
return l1
|
||||||
} else {
|
|
||||||
l2.Next = mergeTwoLists(l1, l2.Next)
|
|
||||||
return l2
|
|
||||||
}
|
}
|
||||||
// if l1 == nil && l2 == nil {
|
l2.Next = mergeTwoLists(l1, l2.Next)
|
||||||
// return nil
|
return l2
|
||||||
// }
|
|
||||||
// head := &ListNode{Val: 0, Next: nil}
|
|
||||||
// current := head
|
|
||||||
// var currentl1, currentl2 *ListNode
|
|
||||||
// for l1 != nil || l2 != nil {
|
|
||||||
// if l1 != nil {
|
|
||||||
// currentl1 = &ListNode{Val: l1.Val, Next: nil}
|
|
||||||
// }
|
|
||||||
// if l2 != nil {
|
|
||||||
// currentl2 = &ListNode{Val: l2.Val, Next: nil}
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if l1 == nil && l2 != nil {
|
|
||||||
// current.Next = currentl2
|
|
||||||
// current = currentl2
|
|
||||||
// l2 = l2.Next
|
|
||||||
// continue
|
|
||||||
// } else if l2 == nil && l1 != nil {
|
|
||||||
// current.Next = currentl1
|
|
||||||
// current = currentl1
|
|
||||||
// l1 = l1.Next
|
|
||||||
// continue
|
|
||||||
// } else if l2 == nil && l1 == nil {
|
|
||||||
// return head.Next
|
|
||||||
// } else {
|
|
||||||
// if currentl1.Val < currentl2.Val {
|
|
||||||
// current.Next = currentl1
|
|
||||||
// current = currentl1
|
|
||||||
// l1 = l1.Next
|
|
||||||
// continue
|
|
||||||
// } else if currentl1.Val == currentl2.Val {
|
|
||||||
// current.Next = currentl2
|
|
||||||
// currentl2.Next = currentl1
|
|
||||||
// current = currentl1
|
|
||||||
// l1 = l1.Next
|
|
||||||
// l2 = l2.Next
|
|
||||||
// continue
|
|
||||||
// } else {
|
|
||||||
// current.Next = currentl2
|
|
||||||
// current = currentl2
|
|
||||||
// l2 = l2.Next
|
|
||||||
// continue
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return head.Next
|
|
||||||
}
|
}
|
||||||
|
@ -31,8 +31,7 @@ func mergeTwoLists1(l1 *ListNode, l2 *ListNode) *ListNode {
|
|||||||
if l1.Val < l2.Val {
|
if l1.Val < l2.Val {
|
||||||
l1.Next = mergeTwoLists1(l1.Next, l2)
|
l1.Next = mergeTwoLists1(l1.Next, l2)
|
||||||
return l1
|
return l1
|
||||||
} else {
|
|
||||||
l2.Next = mergeTwoLists1(l1, l2.Next)
|
|
||||||
return l2
|
|
||||||
}
|
}
|
||||||
|
l2.Next = mergeTwoLists1(l1, l2.Next)
|
||||||
|
return l2
|
||||||
}
|
}
|
||||||
|
@ -14,13 +14,13 @@ func removeDuplicates(nums []int) int {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
nums[last+1] = nums[finder]
|
nums[last+1] = nums[finder]
|
||||||
last += 1
|
last++
|
||||||
}
|
}
|
||||||
return last + 1
|
return last + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func removeDuplicates_(nums []int) int {
|
func removeDuplicates1(nums []int) int {
|
||||||
if len(nums) == 0 {
|
if len(nums) == 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@ -32,14 +32,14 @@ func removeDuplicates_(nums []int) int {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
if nums[i+1] == nums[i] {
|
if nums[i+1] == nums[i] {
|
||||||
removeElement_(nums, i+1, nums[i])
|
removeElement1(nums, i+1, nums[i])
|
||||||
// fmt.Printf("此时 num = %v length = %v\n", nums, length)
|
// fmt.Printf("此时 num = %v length = %v\n", nums, length)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return i + 1
|
return i + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
func removeElement_(nums []int, start, val int) int {
|
func removeElement1(nums []int, start, val int) int {
|
||||||
if len(nums) == 0 {
|
if len(nums) == 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,6 @@ func strStr(haystack string, needle string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func strStr_(haystack string, needle string) int {
|
func strStr1(haystack string, needle string) int {
|
||||||
return strings.Index(haystack, needle)
|
return strings.Index(haystack, needle)
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ func isValidSudoku(board [][]byte) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 添加缓存,时间复杂度 O(n^2)
|
// 解法二 添加缓存,时间复杂度 O(n^2)
|
||||||
func isValidSudoku_(board [][]byte) bool {
|
func isValidSudoku1(board [][]byte) bool {
|
||||||
rowbuf, colbuf, boxbuf := make([][]bool, 9), make([][]bool, 9), make([][]bool, 9)
|
rowbuf, colbuf, boxbuf := make([][]bool, 9), make([][]bool, 9), make([][]bool, 9)
|
||||||
for i := 0; i < 9; i++ {
|
for i := 0; i < 9; i++ {
|
||||||
rowbuf[i] = make([]bool, 9)
|
rowbuf[i] = make([]bool, 9)
|
||||||
|
@ -73,7 +73,7 @@ func Test_Problem36(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans36, q.para36
|
_, p := q.ans36, q.para36
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, isValidSudoku_(p.s))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, isValidSudoku1(p.s))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -8,11 +8,11 @@ func permuteUnique(nums []int) [][]int {
|
|||||||
}
|
}
|
||||||
used, p, res := make([]bool, len(nums)), []int{}, [][]int{}
|
used, p, res := make([]bool, len(nums)), []int{}, [][]int{}
|
||||||
sort.Ints(nums) // 这里是去重的关键逻辑
|
sort.Ints(nums) // 这里是去重的关键逻辑
|
||||||
generatePermutation_47(nums, 0, p, &res, &used)
|
generatePermutation47(nums, 0, p, &res, &used)
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func generatePermutation_47(nums []int, index int, p []int, res *[][]int, used *[]bool) {
|
func generatePermutation47(nums []int, index int, p []int, res *[][]int, used *[]bool) {
|
||||||
if index == len(nums) {
|
if index == len(nums) {
|
||||||
temp := make([]int, len(p))
|
temp := make([]int, len(p))
|
||||||
copy(temp, p)
|
copy(temp, p)
|
||||||
@ -26,7 +26,7 @@ func generatePermutation_47(nums []int, index int, p []int, res *[][]int, used *
|
|||||||
}
|
}
|
||||||
(*used)[i] = true
|
(*used)[i] = true
|
||||||
p = append(p, nums[i])
|
p = append(p, nums[i])
|
||||||
generatePermutation_47(nums, index+1, p, res, used)
|
generatePermutation47(nums, index+1, p, res, used)
|
||||||
p = p[:len(p)-1]
|
p = p[:len(p)-1]
|
||||||
(*used)[i] = false
|
(*used)[i] = false
|
||||||
}
|
}
|
||||||
|
@ -7,14 +7,14 @@ func totalNQueens(n int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二,DFS 回溯法
|
// 解法二,DFS 回溯法
|
||||||
func totalNQueens_(n int) int {
|
func totalNQueens1(n int) int {
|
||||||
col, dia1, dia2, row, res := make([]bool, n), make([]bool, 2*n-1), make([]bool, 2*n-1), []int{}, 0
|
col, dia1, dia2, row, res := make([]bool, n), make([]bool, 2*n-1), make([]bool, 2*n-1), []int{}, 0
|
||||||
putQueen_(n, 0, &col, &dia1, &dia2, &row, &res)
|
putQueen52(n, 0, &col, &dia1, &dia2, &row, &res)
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
// 尝试在一个n皇后问题中, 摆放第index行的皇后位置
|
// 尝试在一个n皇后问题中, 摆放第index行的皇后位置
|
||||||
func putQueen_(n, index int, col, dia1, dia2 *[]bool, row *[]int, res *int) {
|
func putQueen52(n, index int, col, dia1, dia2 *[]bool, row *[]int, res *int) {
|
||||||
if index == n {
|
if index == n {
|
||||||
*res++
|
*res++
|
||||||
return
|
return
|
||||||
@ -26,7 +26,7 @@ func putQueen_(n, index int, col, dia1, dia2 *[]bool, row *[]int, res *int) {
|
|||||||
(*col)[i] = true
|
(*col)[i] = true
|
||||||
(*dia1)[index+i] = true
|
(*dia1)[index+i] = true
|
||||||
(*dia2)[index-i+n-1] = true
|
(*dia2)[index-i+n-1] = true
|
||||||
putQueen_(n, index+1, col, dia1, dia2, row, res)
|
putQueen52(n, index+1, col, dia1, dia2, row, res)
|
||||||
(*col)[i] = false
|
(*col)[i] = false
|
||||||
(*dia1)[index+i] = false
|
(*dia1)[index+i] = false
|
||||||
(*dia2)[index-i+n-1] = false
|
(*dia2)[index-i+n-1] = false
|
||||||
|
@ -22,7 +22,7 @@ func maxSubArray(nums []int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 模拟
|
// 解法二 模拟
|
||||||
func maxSubArray_(nums []int) int {
|
func maxSubArray1(nums []int) int {
|
||||||
if len(nums) == 1 {
|
if len(nums) == 1 {
|
||||||
return nums[0]
|
return nums[0]
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,13 @@ package leetcode
|
|||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Interval define
|
||||||
type Interval struct {
|
type Interval struct {
|
||||||
Start int
|
Start int
|
||||||
End int
|
End int
|
||||||
}
|
}
|
||||||
|
|
||||||
func merge_(intervals []Interval) []Interval {
|
func merge56(intervals []Interval) []Interval {
|
||||||
if len(intervals) == 0 {
|
if len(intervals) == 0 {
|
||||||
return intervals
|
return intervals
|
||||||
}
|
}
|
||||||
@ -35,17 +36,15 @@ func merge_(intervals []Interval) []Interval {
|
|||||||
func max(a int, b int) int {
|
func max(a int, b int) int {
|
||||||
if a > b {
|
if a > b {
|
||||||
return a
|
return a
|
||||||
} else {
|
|
||||||
return b
|
|
||||||
}
|
}
|
||||||
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func min(a int, b int) int {
|
func min(a int, b int) int {
|
||||||
if a > b {
|
if a > b {
|
||||||
return b
|
return b
|
||||||
} else {
|
|
||||||
return a
|
|
||||||
}
|
}
|
||||||
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
func partitionSort(a []Interval, lo, hi int) int {
|
func partitionSort(a []Interval, lo, hi int) int {
|
||||||
|
@ -66,7 +66,7 @@ func Test_Problem56(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans56, q.para56
|
_, p := q.ans56, q.para56
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, merge_(p.one))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, merge56(p.one))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ func minPathSum(grid [][]int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 最原始的方法,辅助空间 O(n^2)
|
// 解法二 最原始的方法,辅助空间 O(n^2)
|
||||||
func minPathSum_(grid [][]int) int {
|
func minPathSum1(grid [][]int) int {
|
||||||
if len(grid) == 0 {
|
if len(grid) == 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ func mySqrt(x int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 牛顿迭代法 https://en.wikipedia.org/wiki/Integer_square_root
|
// 解法二 牛顿迭代法 https://en.wikipedia.org/wiki/Integer_square_root
|
||||||
func mySqrt_(x int) int {
|
func mySqrt1(x int) int {
|
||||||
r := x
|
r := x
|
||||||
for r*r > x {
|
for r*r > x {
|
||||||
r = (r + x/r) / 2
|
r = (r + x/r) / 2
|
||||||
|
@ -41,7 +41,7 @@ func Test_Problem69(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans69, q.para69
|
_, p := q.ans69, q.para69
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, mySqrt_(p.one))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, mySqrt1(p.one))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -23,13 +23,12 @@ func simplifyPath(path string) string {
|
|||||||
}
|
}
|
||||||
if len(stack) == 0 {
|
if len(stack) == 0 {
|
||||||
return "/"
|
return "/"
|
||||||
} else {
|
|
||||||
res = strings.Join(stack, "/")
|
|
||||||
}
|
}
|
||||||
|
res = strings.Join(stack, "/")
|
||||||
return "/" + res
|
return "/" + res
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 golang 的官方库 API
|
// 解法二 golang 的官方库 API
|
||||||
func simplifyPath_(path string) string {
|
func simplifyPath1(path string) string {
|
||||||
return filepath.Clean(path)
|
return filepath.Clean(path)
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ func generateSubsets(nums []int, k, start int, c []int, res *[][]int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func subsets_(nums []int) [][]int {
|
func subsets1(nums []int) [][]int {
|
||||||
res := make([][]int, 1)
|
res := make([][]int, 1)
|
||||||
sort.Ints(nums)
|
sort.Ints(nums)
|
||||||
for i := range nums {
|
for i := range nums {
|
||||||
|
@ -13,7 +13,7 @@ func exist(board [][]byte, word string) bool {
|
|||||||
visited[i] = make([]bool, len(board[0]))
|
visited[i] = make([]bool, len(board[0]))
|
||||||
}
|
}
|
||||||
for i, v := range board {
|
for i, v := range board {
|
||||||
for j, _ := range v {
|
for j := range v {
|
||||||
if searchWord(board, visited, word, 0, i, j) {
|
if searchWord(board, visited, word, 0, i, j) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
func removeDuplicates_80(nums []int) int {
|
func removeDuplicates80(nums []int) int {
|
||||||
if len(nums) == 0 {
|
if len(nums) == 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@ -22,7 +22,7 @@ func removeDuplicates_80(nums []int) int {
|
|||||||
last += 2
|
last += 2
|
||||||
} else {
|
} else {
|
||||||
nums[last+1] = nums[finder]
|
nums[last+1] = nums[finder]
|
||||||
last += 1
|
last++
|
||||||
}
|
}
|
||||||
if finder == len(nums)-1 {
|
if finder == len(nums)-1 {
|
||||||
if nums[finder] != nums[last-1] {
|
if nums[finder] != nums[last-1] {
|
||||||
|
@ -61,7 +61,7 @@ func Test_Problem80(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans80, q.para80
|
_, p := q.ans80, q.para80
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p.one, removeDuplicates_80(p.one))
|
fmt.Printf("【input】:%v 【output】:%v\n", p.one, removeDuplicates80(p.one))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -62,8 +62,7 @@ func deleteDuplicates2(head *ListNode) *ListNode {
|
|||||||
head = head.Next
|
head = head.Next
|
||||||
}
|
}
|
||||||
return deleteDuplicates(head.Next)
|
return deleteDuplicates(head.Next)
|
||||||
} else {
|
|
||||||
head.Next = deleteDuplicates(head.Next)
|
|
||||||
}
|
}
|
||||||
|
head.Next = deleteDuplicates(head.Next)
|
||||||
return head
|
return head
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ func partition(head *ListNode, x int) *ListNode {
|
|||||||
return beforeHead.Next
|
return beforeHead.Next
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DoublyListNode define
|
||||||
type DoublyListNode struct {
|
type DoublyListNode struct {
|
||||||
Val int
|
Val int
|
||||||
Prev *DoublyListNode
|
Prev *DoublyListNode
|
||||||
@ -37,7 +38,7 @@ type DoublyListNode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 双链表
|
// 解法二 双链表
|
||||||
func partition_(head *ListNode, x int) *ListNode {
|
func partition1(head *ListNode, x int) *ListNode {
|
||||||
if head == nil || head.Next == nil {
|
if head == nil || head.Next == nil {
|
||||||
return head
|
return head
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ func flipGrayCode(num int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 直译
|
// 解法二 直译
|
||||||
func grayCode_(n int) []int {
|
func grayCode1(n int) []int {
|
||||||
var l uint = 1 << uint(n)
|
var l uint = 1 << uint(n)
|
||||||
out := make([]int, l)
|
out := make([]int, l)
|
||||||
for i := uint(0); i < l; i++ {
|
for i := uint(0); i < l; i++ {
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func restoreIpAddresses(s string) []string {
|
func restoreIPAddresses(s string) []string {
|
||||||
if s == "" {
|
if s == "" {
|
||||||
return []string{}
|
return []string{}
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ func Test_Problem93(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans93, q.para93
|
_, p := q.ans93, q.para93
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, restoreIpAddresses(p.s))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, restoreIPAddresses(p.s))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ func isValidbst(root *TreeNode, min, max float64) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二,把 BST 按照左中右的顺序输出到数组中,如果是 BST,则数组中的数字是从小到大有序的,如果出现逆序就不是 BST
|
// 解法二,把 BST 按照左中右的顺序输出到数组中,如果是 BST,则数组中的数字是从小到大有序的,如果出现逆序就不是 BST
|
||||||
func isValidBST_(root *TreeNode) bool {
|
func isValidBST1(root *TreeNode) bool {
|
||||||
arr := []int{}
|
arr := []int{}
|
||||||
inOrder(root, &arr)
|
inOrder(root, &arr)
|
||||||
for i := 1; i < len(arr); i++ {
|
for i := 1; i < len(arr); i++ {
|
||||||
|
@ -43,7 +43,7 @@ func levelOrder(root *TreeNode) [][]int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 DFS
|
// 解法二 DFS
|
||||||
func levelOrder_(root *TreeNode) [][]int {
|
func levelOrder1(root *TreeNode) [][]int {
|
||||||
levels := [][]int{}
|
levels := [][]int{}
|
||||||
dfsLevel(root, -1, &levels)
|
dfsLevel(root, -1, &levels)
|
||||||
return levels
|
return levels
|
||||||
|
@ -16,6 +16,7 @@ package leetcode
|
|||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// TreeNode define
|
||||||
type TreeNode struct {
|
type TreeNode struct {
|
||||||
Val int
|
Val int
|
||||||
Left *TreeNode
|
Left *TreeNode
|
||||||
|
@ -32,7 +32,7 @@ func findPath(n *TreeNode, sum int, slice [][]int, stack []int) [][]int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func pathSum_(root *TreeNode, sum int) [][]int {
|
func pathSum1(root *TreeNode, sum int) [][]int {
|
||||||
if root == nil {
|
if root == nil {
|
||||||
return [][]int{}
|
return [][]int{}
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ func flatten(root *TreeNode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 递归
|
// 解法二 递归
|
||||||
func flatten_1(root *TreeNode) {
|
func flatten1(root *TreeNode) {
|
||||||
if root == nil || (root.Left == nil && root.Right == nil) {
|
if root == nil || (root.Left == nil && root.Right == nil) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -37,7 +37,9 @@ func flatten_1(root *TreeNode) {
|
|||||||
}
|
}
|
||||||
root.Right = currRight
|
root.Right = currRight
|
||||||
}
|
}
|
||||||
func flatten_2(root *TreeNode) {
|
|
||||||
|
// 解法三 递归
|
||||||
|
func flatten2(root *TreeNode) {
|
||||||
if root == nil {
|
if root == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ func minimumTotal(triangle [][]int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 正常 DP,空间复杂度 O(n)
|
// 解法二 正常 DP,空间复杂度 O(n)
|
||||||
func minimumTotal_(triangle [][]int) int {
|
func minimumTotal1(triangle [][]int) int {
|
||||||
if len(triangle) == 0 {
|
if len(triangle) == 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ func maxProfit(prices []int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 单调栈
|
// 解法二 单调栈
|
||||||
func maxProfit_(prices []int) int {
|
func maxProfit1(prices []int) int {
|
||||||
if len(prices) == 0 {
|
if len(prices) == 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
func maxProfit_122(prices []int) int {
|
func maxProfit122(prices []int) int {
|
||||||
profit := 0
|
profit := 0
|
||||||
for i := 0; i < len(prices)-1; i++ {
|
for i := 0; i < len(prices)-1; i++ {
|
||||||
if prices[i+1] > prices[i] {
|
if prices[i+1] > prices[i] {
|
||||||
|
@ -56,7 +56,7 @@ func Test_Problem122(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans122, q.para122
|
_, p := q.ans122, q.para122
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, maxProfit_122(p.one))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, maxProfit122(p.one))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ func findLadders(beginWord string, endWord string, wordList []string) [][]string
|
|||||||
if len(result) > 0 {
|
if len(result) > 0 {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
for k, _ := range levelMap {
|
for k := range levelMap {
|
||||||
delete(wordMap, k)
|
delete(wordMap, k)
|
||||||
}
|
}
|
||||||
// clear levelMap
|
// clear levelMap
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
// 解法一
|
// 解法一
|
||||||
func partition_131(s string) [][]string {
|
func partition131(s string) [][]string {
|
||||||
if s == "" {
|
if s == "" {
|
||||||
return [][]string{}
|
return [][]string{}
|
||||||
}
|
}
|
||||||
@ -22,16 +22,16 @@ func findPalindrome(str string, index int, s string, isPal bool, pal []string, r
|
|||||||
if index == 0 {
|
if index == 0 {
|
||||||
s = string(str[index])
|
s = string(str[index])
|
||||||
pal = append(pal, s)
|
pal = append(pal, s)
|
||||||
findPalindrome(str, index+1, s, isPal && isPalindrome_131(s), pal, res)
|
findPalindrome(str, index+1, s, isPal && isPalindrome131(s), pal, res)
|
||||||
} else {
|
} else {
|
||||||
temp := pal[len(pal)-1]
|
temp := pal[len(pal)-1]
|
||||||
s = pal[len(pal)-1] + string(str[index])
|
s = pal[len(pal)-1] + string(str[index])
|
||||||
pal[len(pal)-1] = s
|
pal[len(pal)-1] = s
|
||||||
findPalindrome(str, index+1, s, isPalindrome_131(s), pal, res)
|
findPalindrome(str, index+1, s, isPalindrome131(s), pal, res)
|
||||||
pal[len(pal)-1] = temp
|
pal[len(pal)-1] = temp
|
||||||
if isPalindrome_131(temp) {
|
if isPalindrome131(temp) {
|
||||||
pal = append(pal, string(str[index]))
|
pal = append(pal, string(str[index]))
|
||||||
findPalindrome(str, index+1, temp, isPal && isPalindrome_131(temp), pal, res)
|
findPalindrome(str, index+1, temp, isPal && isPalindrome131(temp), pal, res)
|
||||||
pal = pal[:len(pal)-1]
|
pal = pal[:len(pal)-1]
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -39,7 +39,7 @@ func findPalindrome(str string, index int, s string, isPal bool, pal []string, r
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func isPalindrome_131(s string) bool {
|
func isPalindrome131(s string) bool {
|
||||||
slen := len(s)
|
slen := len(s)
|
||||||
for i, j := 0, slen-1; i < j; i, j = i+1, j-1 {
|
for i, j := 0, slen-1; i < j; i, j = i+1, j-1 {
|
||||||
if s[i] != s[j] {
|
if s[i] != s[j] {
|
||||||
@ -50,18 +50,18 @@ func isPalindrome_131(s string) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func partition_131_2(s string) [][]string {
|
func partition131_1(s string) [][]string {
|
||||||
result := [][]string{}
|
result := [][]string{}
|
||||||
size := len(s)
|
size := len(s)
|
||||||
if size == 0 {
|
if size == 0 {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
current := make([]string, 0, size)
|
current := make([]string, 0, size)
|
||||||
dfs_131(s, 0, current, &result)
|
dfs131(s, 0, current, &result)
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func dfs_131(s string, idx int, cur []string, result *[][]string) {
|
func dfs131(s string, idx int, cur []string, result *[][]string) {
|
||||||
start, end := idx, len(s)
|
start, end := idx, len(s)
|
||||||
if start == end {
|
if start == end {
|
||||||
temp := make([]string, len(cur))
|
temp := make([]string, len(cur))
|
||||||
@ -71,7 +71,7 @@ func dfs_131(s string, idx int, cur []string, result *[][]string) {
|
|||||||
}
|
}
|
||||||
for i := start; i < end; i++ {
|
for i := start; i < end; i++ {
|
||||||
if isPal(s, start, i) {
|
if isPal(s, start, i) {
|
||||||
dfs_131(s, i+1, append(cur, s[start:i+1]), result)
|
dfs131(s, i+1, append(cur, s[start:i+1]), result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ func Test_Problem131(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans131, q.para131
|
_, p := q.ans131, q.para131
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, partition_131(p.s))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, partition131(p.s))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ func singleNumberIIIII(nums []int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func singleNumberIIIII_(nums []int) int {
|
func singleNumberIIIII1(nums []int) int {
|
||||||
twos, threes, ones := 0xffffffff, 0xffffffff, 0
|
twos, threes, ones := 0xffffffff, 0xffffffff, 0
|
||||||
for i := 0; i < len(nums); i++ {
|
for i := 0; i < len(nums); i++ {
|
||||||
threes = threes ^ (nums[i] & twos)
|
threes = threes ^ (nums[i] & twos)
|
||||||
|
@ -11,7 +11,7 @@ func detectCycle(head *ListNode) *ListNode {
|
|||||||
if head == nil || head.Next == nil {
|
if head == nil || head.Next == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
isCycle, slow := hasCycle_(head)
|
isCycle, slow := hasCycle142(head)
|
||||||
if !isCycle {
|
if !isCycle {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -23,7 +23,7 @@ func detectCycle(head *ListNode) *ListNode {
|
|||||||
return fast
|
return fast
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasCycle_(head *ListNode) (bool, *ListNode) {
|
func hasCycle142(head *ListNode) (bool, *ListNode) {
|
||||||
fast := head
|
fast := head
|
||||||
slow := head
|
slow := head
|
||||||
for slow != nil && fast != nil && fast.Next != nil {
|
for slow != nil && fast != nil && fast.Next != nil {
|
||||||
|
@ -46,7 +46,7 @@ func reorderList(head *ListNode) *ListNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 数组
|
// 解法二 数组
|
||||||
func reorderList_1(head *ListNode) *ListNode {
|
func reorderList1(head *ListNode) *ListNode {
|
||||||
array := listToArray(head)
|
array := listToArray(head)
|
||||||
length := len(array)
|
length := len(array)
|
||||||
if length == 0 {
|
if length == 0 {
|
||||||
|
@ -27,7 +27,7 @@ func preorderTraversal(root *TreeNode) []int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func preorderTraversal_(root *TreeNode) []int {
|
func preorderTraversal1(root *TreeNode) []int {
|
||||||
var result []int
|
var result []int
|
||||||
preorder(root, &result)
|
preorder(root, &result)
|
||||||
return result
|
return result
|
||||||
|
@ -18,17 +18,17 @@ func sortList(head *ListNode) *ListNode {
|
|||||||
return head
|
return head
|
||||||
}
|
}
|
||||||
|
|
||||||
middleNode := middleNode_(head)
|
middleNode := middleNode1(head)
|
||||||
cur = middleNode.Next
|
cur = middleNode.Next
|
||||||
middleNode.Next = nil
|
middleNode.Next = nil
|
||||||
middleNode = cur
|
middleNode = cur
|
||||||
|
|
||||||
left := sortList(head)
|
left := sortList(head)
|
||||||
right := sortList(middleNode)
|
right := sortList(middleNode)
|
||||||
return mergeTwoLists_(left, right)
|
return mergeTwoLists148(left, right)
|
||||||
}
|
}
|
||||||
|
|
||||||
func middleNode_(head *ListNode) *ListNode {
|
func middleNode1(head *ListNode) *ListNode {
|
||||||
if head == nil || head.Next == nil {
|
if head == nil || head.Next == nil {
|
||||||
return head
|
return head
|
||||||
}
|
}
|
||||||
@ -41,7 +41,7 @@ func middleNode_(head *ListNode) *ListNode {
|
|||||||
return p1
|
return p1
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeTwoLists_(l1 *ListNode, l2 *ListNode) *ListNode {
|
func mergeTwoLists148(l1 *ListNode, l2 *ListNode) *ListNode {
|
||||||
if l1 == nil {
|
if l1 == nil {
|
||||||
return l2
|
return l2
|
||||||
}
|
}
|
||||||
@ -51,8 +51,7 @@ func mergeTwoLists_(l1 *ListNode, l2 *ListNode) *ListNode {
|
|||||||
if l1.Val < l2.Val {
|
if l1.Val < l2.Val {
|
||||||
l1.Next = mergeTwoLists(l1.Next, l2)
|
l1.Next = mergeTwoLists(l1.Next, l2)
|
||||||
return l1
|
return l1
|
||||||
} else {
|
|
||||||
l2.Next = mergeTwoLists(l1, l2.Next)
|
|
||||||
return l2
|
|
||||||
}
|
}
|
||||||
|
l2.Next = mergeTwoLists(l1, l2.Next)
|
||||||
|
return l2
|
||||||
}
|
}
|
||||||
|
@ -17,28 +17,28 @@ func evalRPN(tokens []string) int {
|
|||||||
sum := stack[top-2] + stack[top-1]
|
sum := stack[top-2] + stack[top-1]
|
||||||
stack = stack[:top-2]
|
stack = stack[:top-2]
|
||||||
stack = append(stack, sum)
|
stack = append(stack, sum)
|
||||||
top -= 1
|
top--
|
||||||
}
|
}
|
||||||
case "-":
|
case "-":
|
||||||
{
|
{
|
||||||
sub := stack[top-2] - stack[top-1]
|
sub := stack[top-2] - stack[top-1]
|
||||||
stack = stack[:top-2]
|
stack = stack[:top-2]
|
||||||
stack = append(stack, sub)
|
stack = append(stack, sub)
|
||||||
top -= 1
|
top--
|
||||||
}
|
}
|
||||||
case "*":
|
case "*":
|
||||||
{
|
{
|
||||||
mul := stack[top-2] * stack[top-1]
|
mul := stack[top-2] * stack[top-1]
|
||||||
stack = stack[:top-2]
|
stack = stack[:top-2]
|
||||||
stack = append(stack, mul)
|
stack = append(stack, mul)
|
||||||
top -= 1
|
top--
|
||||||
}
|
}
|
||||||
case "/":
|
case "/":
|
||||||
{
|
{
|
||||||
div := stack[top-2] / stack[top-1]
|
div := stack[top-2] / stack[top-1]
|
||||||
stack = stack[:top-2]
|
stack = stack[:top-2]
|
||||||
stack = append(stack, div)
|
stack = append(stack, div)
|
||||||
top -= 1
|
top--
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
@ -1,15 +1,19 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
|
// MinStack define
|
||||||
type MinStack struct {
|
type MinStack struct {
|
||||||
elements, min []int
|
elements, min []int
|
||||||
l int
|
l int
|
||||||
}
|
}
|
||||||
|
|
||||||
/** initialize your data structure here. */
|
/** initialize your data structure here. */
|
||||||
func Constructor_155() MinStack {
|
|
||||||
|
// Constructor155 define
|
||||||
|
func Constructor155() MinStack {
|
||||||
return MinStack{make([]int, 0), make([]int, 0), 0}
|
return MinStack{make([]int, 0), make([]int, 0), 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Push define
|
||||||
func (this *MinStack) Push(x int) {
|
func (this *MinStack) Push(x int) {
|
||||||
this.elements = append(this.elements, x)
|
this.elements = append(this.elements, x)
|
||||||
if this.l == 0 {
|
if this.l == 0 {
|
||||||
|
@ -6,7 +6,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Test_Problem155(t *testing.T) {
|
func Test_Problem155(t *testing.T) {
|
||||||
obj1 := Constructor_155()
|
obj1 := Constructor155()
|
||||||
obj1.Push(1)
|
obj1.Push(1)
|
||||||
fmt.Printf("obj1 = %v\n", obj1)
|
fmt.Printf("obj1 = %v\n", obj1)
|
||||||
obj1.Push(0)
|
obj1.Push(0)
|
||||||
@ -15,8 +15,8 @@ func Test_Problem155(t *testing.T) {
|
|||||||
fmt.Printf("obj1 = %v\n", obj1)
|
fmt.Printf("obj1 = %v\n", obj1)
|
||||||
obj1.Pop()
|
obj1.Pop()
|
||||||
fmt.Printf("obj1 = %v\n", obj1)
|
fmt.Printf("obj1 = %v\n", obj1)
|
||||||
param_3 := obj1.Top()
|
param3 := obj1.Top()
|
||||||
fmt.Printf("param_3 = %v\n", param_3)
|
fmt.Printf("param_3 = %v\n", param3)
|
||||||
param_4 := obj1.GetMin()
|
param4 := obj1.GetMin()
|
||||||
fmt.Printf("param_4 = %v\n", param_4)
|
fmt.Printf("param_4 = %v\n", param4)
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ func maximumGap(nums []int) int {
|
|||||||
if len(nums) < 2 {
|
if len(nums) < 2 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
quickSort__(nums, 0, len(nums)-1)
|
quickSort164(nums, 0, len(nums)-1)
|
||||||
|
|
||||||
res := 0
|
res := 0
|
||||||
for i := 0; i < len(nums)-1; i++ {
|
for i := 0; i < len(nums)-1; i++ {
|
||||||
@ -16,7 +16,7 @@ func maximumGap(nums []int) int {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func partition__(a []int, lo, hi int) int {
|
func partition164(a []int, lo, hi int) int {
|
||||||
pivot := a[hi]
|
pivot := a[hi]
|
||||||
i := lo - 1
|
i := lo - 1
|
||||||
for j := lo; j < hi; j++ {
|
for j := lo; j < hi; j++ {
|
||||||
@ -28,17 +28,17 @@ func partition__(a []int, lo, hi int) int {
|
|||||||
a[i+1], a[hi] = a[hi], a[i+1]
|
a[i+1], a[hi] = a[hi], a[i+1]
|
||||||
return i + 1
|
return i + 1
|
||||||
}
|
}
|
||||||
func quickSort__(a []int, lo, hi int) {
|
func quickSort164(a []int, lo, hi int) {
|
||||||
if lo >= hi {
|
if lo >= hi {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
p := partition__(a, lo, hi)
|
p := partition164(a, lo, hi)
|
||||||
quickSort__(a, lo, p-1)
|
quickSort164(a, lo, p-1)
|
||||||
quickSort__(a, p+1, hi)
|
quickSort164(a, p+1, hi)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func maximumGap_(nums []int) int {
|
func maximumGap1(nums []int) int {
|
||||||
|
|
||||||
if nums == nil || len(nums) < 2 {
|
if nums == nil || len(nums) < 2 {
|
||||||
return 0
|
return 0
|
||||||
|
@ -55,7 +55,7 @@ func Test_Problem164(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans164, q.para164
|
_, p := q.ans164, q.para164
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, maximumGap_(p.one))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, maximumGap1(p.one))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
// 解法一 这一题可以利用数组有序的特性
|
// 解法一 这一题可以利用数组有序的特性
|
||||||
func twoSum_(numbers []int, target int) []int {
|
func twoSum167(numbers []int, target int) []int {
|
||||||
i, j := 0, len(numbers)-1
|
i, j := 0, len(numbers)-1
|
||||||
for i < j {
|
for i < j {
|
||||||
if numbers[i]+numbers[j] == target {
|
if numbers[i]+numbers[j] == target {
|
||||||
@ -16,7 +16,7 @@ func twoSum_(numbers []int, target int) []int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 不管数组是否有序,空间复杂度比上一种解法要多 O(n)
|
// 解法二 不管数组是否有序,空间复杂度比上一种解法要多 O(n)
|
||||||
func twoSum__(numbers []int, target int) []int {
|
func twoSum167_1(numbers []int, target int) []int {
|
||||||
m := make(map[int]int)
|
m := make(map[int]int)
|
||||||
for i := 0; i < len(numbers); i++ {
|
for i := 0; i < len(numbers); i++ {
|
||||||
another := target - numbers[i]
|
another := target - numbers[i]
|
||||||
|
@ -37,7 +37,7 @@ func Test_Problem167(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans167, q.para167
|
_, p := q.ans167, q.para167
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p.one, twoSum_(p.one, p.two))
|
fmt.Printf("【input】:%v 【output】:%v\n", p.one, twoSum167(p.one, p.two))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ func majorityElement(nums []int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 时间复杂度 O(n) 空间复杂度 O(n)
|
// 解法二 时间复杂度 O(n) 空间复杂度 O(n)
|
||||||
func majorityElement_(nums []int) int {
|
func majorityElement1(nums []int) int {
|
||||||
m := make(map[int]int)
|
m := make(map[int]int)
|
||||||
for _, v := range nums {
|
for _, v := range nums {
|
||||||
m[v]++
|
m[v]++
|
||||||
|
@ -10,12 +10,15 @@ import "container/heap"
|
|||||||
* Right *TreeNode
|
* Right *TreeNode
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// BSTIterator define
|
||||||
type BSTIterator struct {
|
type BSTIterator struct {
|
||||||
pq PriorityQueueOfInt
|
pq PriorityQueueOfInt
|
||||||
count int
|
count int
|
||||||
}
|
}
|
||||||
|
|
||||||
func Constructor_173(root *TreeNode) BSTIterator {
|
// Constructor173 define
|
||||||
|
func Constructor173(root *TreeNode) BSTIterator {
|
||||||
result, pq := []int{}, PriorityQueueOfInt{}
|
result, pq := []int{}, PriorityQueueOfInt{}
|
||||||
postorder(root, &result)
|
postorder(root, &result)
|
||||||
for _, v := range result {
|
for _, v := range result {
|
||||||
|
@ -8,20 +8,20 @@ import (
|
|||||||
func Test_Problem173(t *testing.T) {
|
func Test_Problem173(t *testing.T) {
|
||||||
|
|
||||||
root := Ints2TreeNode([]int{9, 7, 15, 3, NULL, NULL, 20})
|
root := Ints2TreeNode([]int{9, 7, 15, 3, NULL, NULL, 20})
|
||||||
obj := Constructor_173(root)
|
obj := Constructor173(root)
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
param_1 := obj.Next()
|
param1 := obj.Next()
|
||||||
fmt.Printf("param_1 = %v\n", param_1)
|
fmt.Printf("param_1 = %v\n", param1)
|
||||||
param_2 := obj.HasNext()
|
param2 := obj.HasNext()
|
||||||
fmt.Printf("param_2 = %v\n", param_2)
|
fmt.Printf("param_2 = %v\n", param2)
|
||||||
param_1 = obj.Next()
|
param1 = obj.Next()
|
||||||
fmt.Printf("param_1 = %v\n", param_1)
|
fmt.Printf("param_1 = %v\n", param1)
|
||||||
param_1 = obj.Next()
|
param1 = obj.Next()
|
||||||
fmt.Printf("param_1 = %v\n", param_1)
|
fmt.Printf("param_1 = %v\n", param1)
|
||||||
param_1 = obj.Next()
|
param1 = obj.Next()
|
||||||
fmt.Printf("param_1 = %v\n", param_1)
|
fmt.Printf("param_1 = %v\n", param1)
|
||||||
param_1 = obj.Next()
|
param1 = obj.Next()
|
||||||
fmt.Printf("param_1 = %v\n", param_1)
|
fmt.Printf("param_1 = %v\n", param1)
|
||||||
param_2 = obj.HasNext()
|
param2 = obj.HasNext()
|
||||||
fmt.Printf("param_2 = %v\n", param_2)
|
fmt.Printf("param_2 = %v\n", param2)
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ func findRepeatedDnaSequences(s string) []string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func findRepeatedDnaSequences_(s string) []string {
|
func findRepeatedDnaSequences1(s string) []string {
|
||||||
if len(s) < 10 {
|
if len(s) < 10 {
|
||||||
return []string{}
|
return []string{}
|
||||||
}
|
}
|
||||||
@ -33,7 +33,7 @@ func findRepeatedDnaSequences_(s string) []string {
|
|||||||
if cache[curr] == 1 {
|
if cache[curr] == 1 {
|
||||||
ans = append(ans, curr)
|
ans = append(ans, curr)
|
||||||
}
|
}
|
||||||
cache[curr] += 1
|
cache[curr]++
|
||||||
}
|
}
|
||||||
return ans
|
return ans
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
func reverseBits(num uint32) uint32 {
|
func reverseBits(num uint32) uint32 {
|
||||||
var res uint32 = 0
|
var res uint32
|
||||||
for i := 0; i < 32; i++ {
|
for i := 0; i < 32; i++ {
|
||||||
res = res<<1 | num&1
|
res = res<<1 | num&1
|
||||||
num >>= 1
|
num >>= 1
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
// 解法一 DP
|
// 解法一 DP
|
||||||
func rob_(nums []int) int {
|
func rob198(nums []int) int {
|
||||||
n := len(nums)
|
n := len(nums)
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
return 0
|
return 0
|
||||||
@ -19,7 +19,7 @@ func rob_(nums []int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 DP 优化辅助空间,把迭代的值保存在 2 个变量中
|
// 解法二 DP 优化辅助空间,把迭代的值保存在 2 个变量中
|
||||||
func rob__(nums []int) int {
|
func rob198_1(nums []int) int {
|
||||||
n := len(nums)
|
n := len(nums)
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
return 0
|
return 0
|
||||||
|
@ -45,7 +45,7 @@ func Test_Problem198(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans198, q.para198
|
_, p := q.ans198, q.para198
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, rob_(p.one))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, rob198(p.one))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
// 解法一
|
// 解法一
|
||||||
func rangeBitwiseAnd_(m int, n int) int {
|
func rangeBitwiseAnd1(m int, n int) int {
|
||||||
if m == 0 {
|
if m == 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -15,12 +15,11 @@ func isHappy(n int) bool {
|
|||||||
if _, ok := record[res]; !ok {
|
if _, ok := record[res]; !ok {
|
||||||
if res == 1 {
|
if res == 1 {
|
||||||
return true
|
return true
|
||||||
} else {
|
|
||||||
record[res] = res
|
|
||||||
num = res
|
|
||||||
res = 0
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
record[res] = res
|
||||||
|
num = res
|
||||||
|
res = 0
|
||||||
|
continue
|
||||||
} else {
|
} else {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ type Trie struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Initialize your data structure here. */
|
/** Initialize your data structure here. */
|
||||||
func Constructor_208() Trie {
|
func Constructor208() Trie {
|
||||||
return Trie{isWord: false, children: make(map[rune]*Trie)}
|
return Trie{isWord: false, children: make(map[rune]*Trie)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,18 +6,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Test_Problem208(t *testing.T) {
|
func Test_Problem208(t *testing.T) {
|
||||||
obj := Constructor_208()
|
obj := Constructor208()
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
obj.Insert("apple")
|
obj.Insert("apple")
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
param_1 := obj.Search("apple")
|
param1 := obj.Search("apple")
|
||||||
fmt.Printf("param_1 = %v obj = %v\n", param_1, obj)
|
fmt.Printf("param_1 = %v obj = %v\n", param1, obj)
|
||||||
param_2 := obj.Search("app")
|
param2 := obj.Search("app")
|
||||||
fmt.Printf("param_2 = %v obj = %v\n", param_2, obj)
|
fmt.Printf("param_2 = %v obj = %v\n", param2, obj)
|
||||||
param_3 := obj.StartsWith("app")
|
param3 := obj.StartsWith("app")
|
||||||
fmt.Printf("param_3 = %v obj = %v\n", param_3, obj)
|
fmt.Printf("param_3 = %v obj = %v\n", param3, obj)
|
||||||
obj.Insert("app")
|
obj.Insert("app")
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
param_4 := obj.Search("app")
|
param4 := obj.Search("app")
|
||||||
fmt.Printf("param_4 = %v obj = %v\n", param_4, obj)
|
fmt.Printf("param_4 = %v obj = %v\n", param4, obj)
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ type WordDictionary struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Initialize your data structure here. */
|
/** Initialize your data structure here. */
|
||||||
func Constructor_211() WordDictionary {
|
func Constructor211() WordDictionary {
|
||||||
return WordDictionary{children: make(map[rune]*WordDictionary)}
|
return WordDictionary{children: make(map[rune]*WordDictionary)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Test_Problem211(t *testing.T) {
|
func Test_Problem211(t *testing.T) {
|
||||||
obj := Constructor_211()
|
obj := Constructor211()
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
obj.AddWord("bad")
|
obj.AddWord("bad")
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
@ -15,12 +15,12 @@ func Test_Problem211(t *testing.T) {
|
|||||||
obj.AddWord("mad")
|
obj.AddWord("mad")
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
|
|
||||||
param_1 := obj.Search("pad")
|
param1 := obj.Search("pad")
|
||||||
fmt.Printf("param_1 = %v obj = %v\n", param_1, obj)
|
fmt.Printf("param_1 = %v obj = %v\n", param1, obj)
|
||||||
param_2 := obj.Search("bad")
|
param2 := obj.Search("bad")
|
||||||
fmt.Printf("param_2 = %v obj = %v\n", param_2, obj)
|
fmt.Printf("param_2 = %v obj = %v\n", param2, obj)
|
||||||
param_3 := obj.Search(".ad")
|
param3 := obj.Search(".ad")
|
||||||
fmt.Printf("param_3 = %v obj = %v\n", param_3, obj)
|
fmt.Printf("param_3 = %v obj = %v\n", param3, obj)
|
||||||
param_4 := obj.Search("b..")
|
param4 := obj.Search("b..")
|
||||||
fmt.Printf("param_4 = %v obj = %v\n", param_4, obj)
|
fmt.Printf("param_4 = %v obj = %v\n", param4, obj)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
func rob_213(nums []int) int {
|
func rob213(nums []int) int {
|
||||||
n := len(nums)
|
n := len(nums)
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
return 0
|
return 0
|
||||||
@ -12,10 +12,10 @@ func rob_213(nums []int) int {
|
|||||||
return max(nums[0], nums[1])
|
return max(nums[0], nums[1])
|
||||||
}
|
}
|
||||||
// 由于首尾是相邻的,所以需要对比 [0,n-1]、[1,n] 这两个区间的最大值
|
// 由于首尾是相邻的,所以需要对比 [0,n-1]、[1,n] 这两个区间的最大值
|
||||||
return max(rob_213_(nums, 0, n-2), rob_213_(nums, 1, n-1))
|
return max(rob213_1(nums, 0, n-2), rob213_1(nums, 1, n-1))
|
||||||
}
|
}
|
||||||
|
|
||||||
func rob_213_(nums []int, start, end int) int {
|
func rob213_1(nums []int, start, end int) int {
|
||||||
preMax := nums[start]
|
preMax := nums[start]
|
||||||
curMax := max(preMax, nums[start+1])
|
curMax := max(preMax, nums[start+1])
|
||||||
for i := start + 2; i <= end; i++ {
|
for i := start + 2; i <= end; i++ {
|
||||||
|
@ -45,7 +45,7 @@ func Test_Problem213(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans213, q.para213
|
_, p := q.ans213, q.para213
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, rob_213(p.one))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, rob213(p.one))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package leetcode
|
|||||||
import "sort"
|
import "sort"
|
||||||
|
|
||||||
// 解法一 排序,排序的方法反而速度是最快的
|
// 解法一 排序,排序的方法反而速度是最快的
|
||||||
func findKthLargest_(nums []int, k int) int {
|
func findKthLargest1(nums []int, k int) int {
|
||||||
sort.Ints(nums)
|
sort.Ints(nums)
|
||||||
return nums[len(nums)-k]
|
return nums[len(nums)-k]
|
||||||
}
|
}
|
||||||
@ -17,13 +17,10 @@ func findKthLargest(nums []int, k int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func selection(arr []int, l, r, k int) int {
|
func selection(arr []int, l, r, k int) int {
|
||||||
|
|
||||||
if l == r {
|
if l == r {
|
||||||
return arr[l]
|
return arr[l]
|
||||||
}
|
}
|
||||||
|
p := partition164(arr, l, r)
|
||||||
p := partition__(arr, l, r)
|
|
||||||
|
|
||||||
if k == p {
|
if k == p {
|
||||||
return arr[p]
|
return arr[p]
|
||||||
} else if k < p {
|
} else if k < p {
|
||||||
|
@ -49,7 +49,7 @@ func Test_Problem215(t *testing.T) {
|
|||||||
|
|
||||||
question215{
|
question215{
|
||||||
para215{[]int{3, 2, 3, 1, 2, 4, 5, 5, 6, 7, 7, 8, 2, 3, 1, 1, 1, 10, 11, 5, 6, 2, 4, 7, 8, 5, 6}, 20},
|
para215{[]int{3, 2, 3, 1, 2, 4, 5, 5, 6, 7, 7, 8, 2, 3, 1, 1, 1, 10, 11, 5, 6, 2, 4, 7, 8, 5, 6}, 20},
|
||||||
ans215{10},
|
ans215{2},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ func calculate(s string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func calculate_(s string) int {
|
func calculate1(s string) int {
|
||||||
stack := []byte{}
|
stack := []byte{}
|
||||||
for i := 0; i < len(s); i++ {
|
for i := 0; i < len(s); i++ {
|
||||||
if s[i] == ' ' {
|
if s[i] == ' ' {
|
||||||
|
@ -6,7 +6,7 @@ type MyStack struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Initialize your data structure here. */
|
/** Initialize your data structure here. */
|
||||||
func Constructor_225() MyStack {
|
func Constructor225() MyStack {
|
||||||
return MyStack{[]int{}, []int{}}
|
return MyStack{[]int{}, []int{}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,18 +6,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Test_Problem225(t *testing.T) {
|
func Test_Problem225(t *testing.T) {
|
||||||
obj := Constructor_225()
|
obj := Constructor225()
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
param_5 := obj.Empty()
|
param5 := obj.Empty()
|
||||||
fmt.Printf("param_5 = %v\n", param_5)
|
fmt.Printf("param_5 = %v\n", param5)
|
||||||
obj.Push(2)
|
obj.Push(2)
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
obj.Push(10)
|
obj.Push(10)
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
param_2 := obj.Pop()
|
param2 := obj.Pop()
|
||||||
fmt.Printf("param_2 = %v\n", param_2)
|
fmt.Printf("param_2 = %v\n", param2)
|
||||||
param_3 := obj.Top()
|
param3 := obj.Top()
|
||||||
fmt.Printf("param_3 = %v\n", param_3)
|
fmt.Printf("param_3 = %v\n", param3)
|
||||||
param_4 := obj.Empty()
|
param4 := obj.Empty()
|
||||||
fmt.Printf("param_4 = %v\n", param_4)
|
fmt.Printf("param_4 = %v\n", param4)
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
// 解法一 时间复杂度 O(n) 空间复杂度 O(1)
|
// 解法一 时间复杂度 O(n) 空间复杂度 O(1)
|
||||||
func majorityElement_229(nums []int) []int {
|
func majorityElement229(nums []int) []int {
|
||||||
// since we are checking if a num appears more than 1/3 of the time
|
// since we are checking if a num appears more than 1/3 of the time
|
||||||
// it is only possible to have at most 2 nums (>1/3 + >1/3 = >2/3)
|
// it is only possible to have at most 2 nums (>1/3 + >1/3 = >2/3)
|
||||||
count1, count2, candidate1, candidate2 := 0, 0, 0, 1
|
count1, count2, candidate1, candidate2 := 0, 0, 0, 1
|
||||||
@ -46,7 +46,7 @@ func majorityElement_229(nums []int) []int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 时间复杂度 O(n) 空间复杂度 O(n)
|
// 解法二 时间复杂度 O(n) 空间复杂度 O(n)
|
||||||
func majorityElement_229_(nums []int) []int {
|
func majorityElement229_1(nums []int) []int {
|
||||||
result, m := make([]int, 0), make(map[int]int)
|
result, m := make([]int, 0), make(map[int]int)
|
||||||
for _, val := range nums {
|
for _, val := range nums {
|
||||||
if v, ok := m[val]; ok {
|
if v, ok := m[val]; ok {
|
||||||
|
@ -41,7 +41,7 @@ func Test_Problem229(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans229, q.para229
|
_, p := q.ans229, q.para229
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, majorityElement_229(p.s))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, majorityElement229(p.s))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -10,18 +10,18 @@ package leetcode
|
|||||||
*/
|
*/
|
||||||
func kthSmallest(root *TreeNode, k int) int {
|
func kthSmallest(root *TreeNode, k int) int {
|
||||||
res, count := 0, 0
|
res, count := 0, 0
|
||||||
inorder_(root, k, &count, &res)
|
inorder230(root, k, &count, &res)
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func inorder_(node *TreeNode, k int, count *int, ans *int) {
|
func inorder230(node *TreeNode, k int, count *int, ans *int) {
|
||||||
if node != nil {
|
if node != nil {
|
||||||
inorder_(node.Left, k, count, ans)
|
inorder230(node.Left, k, count, ans)
|
||||||
*count++
|
*count++
|
||||||
if *count == k {
|
if *count == k {
|
||||||
*ans = node.Val
|
*ans = node.Val
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
inorder_(node.Right, k, count, ans)
|
inorder230(node.Right, k, count, ans)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,19 +6,19 @@ func isPowerOfTwo(num int) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 数论
|
// 解法二 数论
|
||||||
func isPowerOfTwo_1(num int) bool {
|
func isPowerOfTwo1(num int) bool {
|
||||||
return num > 0 && (1073741824%num == 0)
|
return num > 0 && (1073741824%num == 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解法三 打表法
|
// 解法三 打表法
|
||||||
func isPowerOfTwo_2(num int) bool {
|
func isPowerOfTwo2(num int) bool {
|
||||||
allPowerOfTwoMap := map[int]int{1: 1, 2: 2, 4: 4, 8: 8, 16: 16, 32: 32, 64: 64, 128: 128, 256: 256, 512: 512, 1024: 1024, 2048: 2048, 4096: 4096, 8192: 8192, 16384: 16384, 32768: 32768, 65536: 65536, 131072: 131072, 262144: 262144, 524288: 524288, 1048576: 1048576, 2097152: 2097152, 4194304: 4194304, 8388608: 8388608, 16777216: 16777216, 33554432: 33554432, 67108864: 67108864, 134217728: 134217728, 268435456: 268435456, 536870912: 536870912, 1073741824: 1073741824}
|
allPowerOfTwoMap := map[int]int{1: 1, 2: 2, 4: 4, 8: 8, 16: 16, 32: 32, 64: 64, 128: 128, 256: 256, 512: 512, 1024: 1024, 2048: 2048, 4096: 4096, 8192: 8192, 16384: 16384, 32768: 32768, 65536: 65536, 131072: 131072, 262144: 262144, 524288: 524288, 1048576: 1048576, 2097152: 2097152, 4194304: 4194304, 8388608: 8388608, 16777216: 16777216, 33554432: 33554432, 67108864: 67108864, 134217728: 134217728, 268435456: 268435456, 536870912: 536870912, 1073741824: 1073741824}
|
||||||
_, ok := allPowerOfTwoMap[num]
|
_, ok := allPowerOfTwoMap[num]
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解法四 循环
|
// 解法四 循环
|
||||||
func isPowerOfTwo_3(num int) bool {
|
func isPowerOfTwo3(num int) bool {
|
||||||
for num >= 2 {
|
for num >= 2 {
|
||||||
if num%2 == 0 {
|
if num%2 == 0 {
|
||||||
num = num / 2
|
num = num / 2
|
||||||
|
@ -6,7 +6,7 @@ type MyQueue struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Initialize your data structure here. */
|
/** Initialize your data structure here. */
|
||||||
func Constructor_232() MyQueue {
|
func Constructor232() MyQueue {
|
||||||
tmp1, tmp2 := []int{}, []int{}
|
tmp1, tmp2 := []int{}, []int{}
|
||||||
return MyQueue{Stack: &tmp1, Queue: &tmp2}
|
return MyQueue{Stack: &tmp1, Queue: &tmp2}
|
||||||
}
|
}
|
||||||
|
@ -6,16 +6,16 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Test_Problem232(t *testing.T) {
|
func Test_Problem232(t *testing.T) {
|
||||||
obj := Constructor_232()
|
obj := Constructor232()
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
obj.Push(2)
|
obj.Push(2)
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
obj.Push(10)
|
obj.Push(10)
|
||||||
fmt.Printf("obj = %v\n", obj)
|
fmt.Printf("obj = %v\n", obj)
|
||||||
param_2 := obj.Pop()
|
param2 := obj.Pop()
|
||||||
fmt.Printf("param_2 = %v\n", param_2)
|
fmt.Printf("param_2 = %v\n", param2)
|
||||||
param_3 := obj.Peek()
|
param3 := obj.Peek()
|
||||||
fmt.Printf("param_3 = %v\n", param_3)
|
fmt.Printf("param_3 = %v\n", param3)
|
||||||
param_4 := obj.Empty()
|
param4 := obj.Empty()
|
||||||
fmt.Printf("param_4 = %v\n", param_4)
|
fmt.Printf("param_4 = %v\n", param4)
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ package leetcode
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// 此题和 143 题 Reorder List 思路基本一致
|
// 此题和 143 题 Reorder List 思路基本一致
|
||||||
func isPalindrome_(head *ListNode) bool {
|
func isPalindrome234(head *ListNode) bool {
|
||||||
if head == nil || head.Next == nil {
|
if head == nil || head.Next == nil {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -56,6 +56,7 @@ func isPalindrome_(head *ListNode) bool {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// L2ss define
|
||||||
func L2ss(head *ListNode) []int {
|
func L2ss(head *ListNode) []int {
|
||||||
res := []int{}
|
res := []int{}
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ func Test_Problem234(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans234, q.para234
|
_, p := q.ans234, q.para234
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, isPalindrome_(S2l(p.one)))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, isPalindrome234(S2l(p.one)))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,12 @@ package leetcode
|
|||||||
* Right *ListNode
|
* Right *ListNode
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
func lowestCommonAncestor_(root, p, q *TreeNode) *TreeNode {
|
func lowestCommonAncestor236(root, p, q *TreeNode) *TreeNode {
|
||||||
if root == nil || root == q || root == p {
|
if root == nil || root == q || root == p {
|
||||||
return root
|
return root
|
||||||
}
|
}
|
||||||
left := lowestCommonAncestor_(root.Left, p, q)
|
left := lowestCommonAncestor236(root.Left, p, q)
|
||||||
right := lowestCommonAncestor_(root.Right, p, q)
|
right := lowestCommonAncestor236(root.Right, p, q)
|
||||||
if left != nil {
|
if left != nil {
|
||||||
if right != nil {
|
if right != nil {
|
||||||
return root
|
return root
|
||||||
|
@ -62,7 +62,7 @@ func Test_Problem236(t *testing.T) {
|
|||||||
rootOne := Ints2TreeNode(p.one)
|
rootOne := Ints2TreeNode(p.one)
|
||||||
rootTwo := Ints2TreeNode(p.two)
|
rootTwo := Ints2TreeNode(p.two)
|
||||||
rootThr := Ints2TreeNode(p.thr)
|
rootThr := Ints2TreeNode(p.thr)
|
||||||
fmt.Printf("【output】:%v \n", lowestCommonAncestor_(rootOne, rootTwo, rootThr))
|
fmt.Printf("【output】:%v \n", lowestCommonAncestor236(rootOne, rootTwo, rootThr))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
// 解法一 暴力解法 O(nk):
|
// 解法一 暴力解法 O(nk)
|
||||||
func maxSlidingWindow_(a []int, k int) []int {
|
func maxSlidingWindow1(a []int, k int) []int {
|
||||||
res := make([]int, 0, k)
|
res := make([]int, 0, k)
|
||||||
n := len(a)
|
n := len(a)
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
|
@ -23,7 +23,7 @@ func isAnagram(s string, t string) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func isAnagram_(s string, t string) bool {
|
func isAnagram1(s string, t string) bool {
|
||||||
if s == "" && t == "" {
|
if s == "" && t == "" {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,8 @@ func hIndex(citations []int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func hIndex_(citations []int) int {
|
func hIndex1(citations []int) int {
|
||||||
quickSort__(citations, 0, len(citations)-1)
|
quickSort164(citations, 0, len(citations)-1)
|
||||||
hIndex := 0
|
hIndex := 0
|
||||||
for i := len(citations) - 1; i >= 0; i-- {
|
for i := len(citations) - 1; i >= 0; i-- {
|
||||||
if citations[i] >= len(citations)-i {
|
if citations[i] >= len(citations)-i {
|
||||||
|
@ -19,7 +19,7 @@ func findDuplicate(nums []int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func findDuplicate_(nums []int) int {
|
func findDuplicate1(nums []int) int {
|
||||||
if len(nums) == 0 {
|
if len(nums) == 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ func lengthOfLIS(nums []int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 O(n log n) DP
|
// 解法二 O(n log n) DP
|
||||||
func lengthOfLIS_(nums []int) int {
|
func lengthOfLIS1(nums []int) int {
|
||||||
dp := []int{}
|
dp := []int{}
|
||||||
for _, num := range nums {
|
for _, num := range nums {
|
||||||
i := sort.SearchInts(dp, num)
|
i := sort.SearchInts(dp, num)
|
||||||
|
@ -35,7 +35,6 @@ func recursiveCheck(num string, x1 int, x2 int, left int) bool {
|
|||||||
}
|
}
|
||||||
if strings.HasPrefix(num[left:], strconv.Itoa(x1+x2)) {
|
if strings.HasPrefix(num[left:], strconv.Itoa(x1+x2)) {
|
||||||
return recursiveCheck(num, x2, x1+x2, left+len(strconv.Itoa(x1+x2)))
|
return recursiveCheck(num, x2, x1+x2, left+len(strconv.Itoa(x1+x2)))
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 解法一 DP
|
// 解法一 DP
|
||||||
func maxProfit_309(prices []int) int {
|
func maxProfit309(prices []int) int {
|
||||||
if len(prices) <= 1 {
|
if len(prices) <= 1 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
buy, sell := make([]int, len(prices)), make([]int, len(prices))
|
buy, sell := make([]int, len(prices)), make([]int, len(prices))
|
||||||
for i, _ := range buy {
|
for i := range buy {
|
||||||
buy[i] = math.MinInt64
|
buy[i] = math.MinInt64
|
||||||
}
|
}
|
||||||
buy[0] = -prices[0]
|
buy[0] = -prices[0]
|
||||||
@ -24,7 +24,7 @@ func maxProfit_309(prices []int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 优化辅助空间的 DP
|
// 解法二 优化辅助空间的 DP
|
||||||
func maxProfit_309_(prices []int) int {
|
func maxProfit309_1(prices []int) int {
|
||||||
if len(prices) <= 1 {
|
if len(prices) <= 1 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ func Test_Problem309(t *testing.T) {
|
|||||||
|
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
_, p := q.ans309, q.para309
|
_, p := q.ans309, q.para309
|
||||||
fmt.Printf("【input】:%v 【output】:%v\n", p, maxProfit_309(p.one))
|
fmt.Printf("【input】:%v 【output】:%v\n", p, maxProfit309(p.one))
|
||||||
}
|
}
|
||||||
fmt.Printf("\n\n\n")
|
fmt.Printf("\n\n\n")
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ func wiggleSort(nums []int) {
|
|||||||
if len(nums) < 2 {
|
if len(nums) < 2 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
median := findKthLargest_324(nums, (len(nums)+1)/2)
|
median := findKthLargest324(nums, (len(nums)+1)/2)
|
||||||
n, i, left, right := len(nums), 0, 0, len(nums)-1
|
n, i, left, right := len(nums), 0, 0, len(nums)-1
|
||||||
|
|
||||||
for i <= right {
|
for i <= right {
|
||||||
@ -30,29 +30,29 @@ func indexMap(index, n int) int {
|
|||||||
return (1 + 2*index) % (n | 1)
|
return (1 + 2*index) % (n | 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func findKthLargest_324(nums []int, k int) int {
|
func findKthLargest324(nums []int, k int) int {
|
||||||
if len(nums) == 0 {
|
if len(nums) == 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
return selection_324(nums, 0, len(nums)-1, len(nums)-k)
|
return selection324(nums, 0, len(nums)-1, len(nums)-k)
|
||||||
}
|
}
|
||||||
|
|
||||||
func selection_324(arr []int, l, r, k int) int {
|
func selection324(arr []int, l, r, k int) int {
|
||||||
if l == r {
|
if l == r {
|
||||||
return arr[l]
|
return arr[l]
|
||||||
}
|
}
|
||||||
p := partition__324(arr, l, r)
|
p := partition324(arr, l, r)
|
||||||
|
|
||||||
if k == p {
|
if k == p {
|
||||||
return arr[p]
|
return arr[p]
|
||||||
} else if k < p {
|
} else if k < p {
|
||||||
return selection_324(arr, l, p-1, k)
|
return selection324(arr, l, p-1, k)
|
||||||
} else {
|
} else {
|
||||||
return selection_324(arr, p+1, r, k)
|
return selection324(arr, p+1, r, k)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func partition__324(a []int, lo, hi int) int {
|
func partition324(a []int, lo, hi int) int {
|
||||||
pivot := a[hi]
|
pivot := a[hi]
|
||||||
i := lo - 1
|
i := lo - 1
|
||||||
for j := lo; j < hi; j++ {
|
for j := lo; j < hi; j++ {
|
||||||
@ -66,7 +66,7 @@ func partition__324(a []int, lo, hi int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二
|
// 解法二
|
||||||
func wiggleSort_(nums []int) {
|
func wiggleSort1(nums []int) {
|
||||||
if len(nums) < 2 {
|
if len(nums) < 2 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ func isPowerOfThree(n int) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 打表法
|
// 解法二 打表法
|
||||||
func isPowerOfThree_1(n int) bool {
|
func isPowerOfThree1(n int) bool {
|
||||||
// 1162261467 is 3^19, 3^20 is bigger than int
|
// 1162261467 is 3^19, 3^20 is bigger than int
|
||||||
allPowerOfThreeMap := map[int]int{1: 1, 3: 3, 9: 9, 27: 27, 81: 81, 243: 243, 729: 729, 2187: 2187, 6561: 6561, 19683: 19683, 59049: 59049, 177147: 177147, 531441: 531441, 1594323: 1594323, 4782969: 4782969, 14348907: 14348907, 43046721: 43046721, 129140163: 129140163, 387420489: 387420489, 1162261467: 1162261467}
|
allPowerOfThreeMap := map[int]int{1: 1, 3: 3, 9: 9, 27: 27, 81: 81, 243: 243, 729: 729, 2187: 2187, 6561: 6561, 19683: 19683, 59049: 59049, 177147: 177147, 531441: 531441, 1594323: 1594323, 4782969: 4782969, 14348907: 14348907, 43046721: 43046721, 129140163: 129140163, 387420489: 387420489, 1162261467: 1162261467}
|
||||||
_, ok := allPowerOfThreeMap[n]
|
_, ok := allPowerOfThreeMap[n]
|
||||||
@ -15,7 +15,7 @@ func isPowerOfThree_1(n int) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法三 循环
|
// 解法三 循环
|
||||||
func isPowerOfThree_2(num int) bool {
|
func isPowerOfThree2(num int) bool {
|
||||||
for num >= 3 {
|
for num >= 3 {
|
||||||
if num%3 == 0 {
|
if num%3 == 0 {
|
||||||
num = num / 3
|
num = num / 3
|
||||||
|
@ -6,7 +6,7 @@ func isPowerOfFour(num int) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 循环
|
// 解法二 循环
|
||||||
func isPowerOfFour_(num int) bool {
|
func isPowerOfFour1(num int) bool {
|
||||||
for num >= 4 {
|
for num >= 4 {
|
||||||
if num%4 == 0 {
|
if num%4 == 0 {
|
||||||
num = num / 4
|
num = num / 4
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
func integerBreak(n int) int {
|
func integerBreak(n int) int {
|
||||||
var dp []int = make([]int, n+1)
|
dp := make([]int, n+1)
|
||||||
dp[0], dp[1] = 1, 1
|
dp[0], dp[1] = 1, 1
|
||||||
for i := 1; i <= n; i++ {
|
for i := 1; i <= n; i++ {
|
||||||
for j := 1; j < i; j++ {
|
for j := 1; j < i; j++ {
|
||||||
|
@ -22,7 +22,6 @@ func reverseVowels(s string) string {
|
|||||||
func isVowels(s byte) bool {
|
func isVowels(s byte) bool {
|
||||||
if s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u' || s == 'A' || s == 'E' || s == 'I' || s == 'O' || s == 'U' {
|
if s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u' || s == 'A' || s == 'E' || s == 'I' || s == 'O' || s == 'U' {
|
||||||
return true
|
return true
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ func topKFrequent(nums []int, k int) []int {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Item define
|
||||||
type Item struct {
|
type Item struct {
|
||||||
key int
|
key int
|
||||||
count int
|
count int
|
||||||
@ -40,11 +41,13 @@ func (pq PriorityQueue) Swap(i, j int) {
|
|||||||
pq[i], pq[j] = pq[j], pq[i]
|
pq[i], pq[j] = pq[j], pq[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Push define
|
||||||
func (pq *PriorityQueue) Push(x interface{}) {
|
func (pq *PriorityQueue) Push(x interface{}) {
|
||||||
item := x.(*Item)
|
item := x.(*Item)
|
||||||
*pq = append(*pq, item)
|
*pq = append(*pq, item)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pop define
|
||||||
func (pq *PriorityQueue) Pop() interface{} {
|
func (pq *PriorityQueue) Pop() interface{} {
|
||||||
n := len(*pq)
|
n := len(*pq)
|
||||||
item := (*pq)[n-1]
|
item := (*pq)[n-1]
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package leetcode
|
package leetcode
|
||||||
|
|
||||||
// 暴力打表法
|
// 暴力打表法
|
||||||
func countNumbersWithUniqueDigits_(n int) int {
|
func countNumbersWithUniqueDigits1(n int) int {
|
||||||
res := []int{1, 10, 91, 739, 5275, 32491, 168571, 712891, 2345851, 5611771, 8877691}
|
res := []int{1, 10, 91, 739, 5275, 32491, 168571, 712891, 2345851, 5611771, 8877691}
|
||||||
if n >= 10 {
|
if n >= 10 {
|
||||||
return res[10]
|
return res[10]
|
||||||
|
@ -22,7 +22,7 @@ func isSubsequence(s string, t string) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 解法二 O(n)
|
// 解法二 O(n)
|
||||||
func isSubsequence_(s string, t string) bool {
|
func isSubsequence1(s string, t string) bool {
|
||||||
for len(s) > 0 && len(t) > 0 {
|
for len(s) > 0 && len(t) > 0 {
|
||||||
if s[0] == t[0] {
|
if s[0] == t[0] {
|
||||||
s = s[1:]
|
s = s[1:]
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user