Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions Week 06/id_531/leetCode_208_531.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package id_531

type Node struct {
isWord bool
next map[string]*Node
}

func NewNode() *Node {
return &Node{next: make(map[string]*Node)}
}

type Trie struct {
root *Node
}

func Constructor() Trie {
return Trie{root: NewNode()}
}

func (t *Trie) Insert(word string) {
add(t.root, word, 0)
}

func add(node *Node, word string, index int) {
if index == len(word) {
if !node.isWord {
node.isWord = true
}
return
}

c := string([]rune(word)[index])
if node.next[c] == nil {
node.next[c] = NewNode()
}
add(node.next[c], word, index+1)
}

func (t *Trie) Search(word string) bool {
return contains(t.root, word, 0)
}

func contains(node *Node, word string, index int) bool {
if index == len(word) {
return node.isWord
}

c := string([]rune(word)[index])
if node.next[c] == nil {
return false
}
return contains(node.next[c], word, index+1)
}

func (t *Trie) StartsWith(prefix string) bool {
return isPrefix(t.root, prefix, 0)
}

func isPrefix(node *Node, prefix string, index int) bool {
if index == len(prefix) {
return true
}

c := string([]rune(prefix)[index])
if node.next[c] == nil {
return false
}

return isPrefix(node.next[c], prefix, index+1)
}
60 changes: 60 additions & 0 deletions Week 06/id_531/leetCode_51_531.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package id_531

func solveNQueens(n int) [][]string {
if n == 0 {
return nil
}
res := make([][]int, 0)
//存放列,撇,捺
cols := make(map[int]bool, n)
pies := make(map[int]bool, n)
nas := make(map[int]bool, n)
dfs([]int{}, n, cols, pies, nas, &res)
return generateResult(res, n)
}

func dfs(rows []int, n int, cols, pies, nas map[int]bool, res *[][]int) {
//出递归的条件
row := len(rows)
if row == n {
tmp := make([]int, len(rows))
copy(tmp, rows)
*res = append(*res, tmp)
return
}
//对于每一层就遍历所有的列
for col := 0; col < n; col++ {
//当列,撇,捺中都不存在对应的值时,将其加入
if !cols[col] && !pies[row+col] && !nas[row-col] {
//开始更新列撇捺的值
cols[col] = true
pies[row+col] = true
nas[row-col] = true
//递归执行下一层操作
dfs(append(rows, col), n, cols, pies, nas, res)
//每一次递归完成后将原有的标志位清空,以方便下一层搜索
cols[col] = false
pies[row+col] = false
nas[row-col] = false
}
}
}

func generateResult(res [][]int, n int) (result [][]string) {
for _, v := range res {
var s []string
for _, val := range v {
str := ""
for i := 0; i < n; i++ {
if i == val {
str += "Q"
} else {
str += "."
}
}
s = append(s, str)
}
result = append(result, s)
}
return
}
37 changes: 37 additions & 0 deletions Week 07/id_531/leetCode_493_531.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package id_531

func reversePairs(nums []int) int {
return mergeSort(nums, 0, len(nums)-1)
}

func mergeSort(nums []int, left, right int) int {
if left >= right {
return 0
}
mid := left + (right-left)/2
count := mergeSort(nums, left, mid) + mergeSort(nums, mid+1, right)
cache := make([]int, right-left+1)
i := left
t := left
c := 0
for j := mid + 1; j < right; j++ {
for i <= mid && nums[i] <= 2*nums[j] {
i++
}
for t <= mid && nums[t] < nums[j] {
c++
t++
cache[c] = nums[t]
}
cache[c] = nums[j]
count += mid - i + 1
c++
}
for t <= mid {
c++
t++
cache[c] = nums[t]
}
copy(nums, cache)
return count
}
45 changes: 45 additions & 0 deletions Week 07/id_531/leetCode_56_531.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package id_531

import "sort"

type ByRow [][]int

func (b ByRow) Len() int {
return len(b)
}

func (b ByRow) Swap(i, j int) {
b[i], b[j] = b[j], b[i]
}

func (b ByRow) Less(i, j int) bool {
return b[i][0] < b[j][0]
}

func merge(intervals [][]int) [][]int {
res := make([][]int, 0)
if len(intervals) == 0 {
return res
}
sort.Sort(ByRow(intervals))
tmp := make([]int, 2)
tmp[0] = intervals[0][0]
tmp[1] = intervals[0][1]

for i := 1; i < len(intervals); i++ {

if tmp[1] >= intervals[i][0] {
if tmp[1] < intervals[i][1] {
tmp[1] = intervals[i][1]
}
} else {
res = append(res, []int{tmp[0], tmp[1]})
tmp[0] = intervals[i][0]
tmp[1] = intervals[i][1]
}
}

res = append(res, []int{tmp[0], tmp[1]})

return res
}
4 changes: 4 additions & 0 deletions Week 08/id_531/NOTE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# NOTE



52 changes: 52 additions & 0 deletions Week 08/id_531/leetCode_300_531.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package id_531

type state struct {
s [][]int
}

func (s *state) Add(n int) {
ok := true
for i, l := range s.s {
if n >= l[0] {
ok = false
}
if n > l[len(l)-1] {
s.s[i] = append(l, n)
} else {
if len(l)-2 < 0 || len(l)-2 >= 0 && n > l[len(l)-2] {
l[len(l)-1] = n
}
s.s[i] = l
}
}
if ok {
// fmt.Printf("%v ?? %v \n", n, s.s)
s.s = append(s.s, []int{n})
}
}
func (s *state) Res() int {
max := 0
for _, l := range s.s {
if len(l) > max {
max = len(l)
}
}
return max
}
func lengthOfLIS(nums []int) int {
if len(nums) <= 1 {
return len(nums)
}
s := &state{}

for i, n := range nums {
if i == 0 {
s = &state{s: [][]int{{n}}}
continue
}
s.Add(n)

}
ans := s.Res()
return ans
}
18 changes: 18 additions & 0 deletions Week 08/id_531/leetCode_387_531.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package id_531

func firstUniqChar(s string) int {
m := make(map[int32]int)
for _, a := range s {
if c, ok := m[a]; ok {
m[a] = c + 1
} else {
m[a] = 1
}
}
for i, a := range s {
if m[a] == 1 {
return i
}
}
return -1
}