Skip to content

Commit 32c128e

Browse files
committed
done 300
1 parent eb3ffa4 commit 32c128e

File tree

7 files changed

+126
-19
lines changed

7 files changed

+126
-19
lines changed

Diff for: common/heap/maxHeap.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func shiftDown(arr []int, root, maxLen int) {
8484
// Create1 时间复杂度为O(NlogN).
8585
func Create1(arr []int) MaxHeap {
8686
l := len(arr)
87-
res := MaxHeap{make([]int, l)}
87+
res := MaxHeap{make([]int, 0, l)}
8888
for v := range arr {
8989
res.Insert(v)
9090
}

Diff for: common/main.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ package main
22

33
import (
44
"fmt"
5+
"leetcode/common/heap"
56
"leetcode/common/sort"
67
)
78

89
func main() {
910
a := []int{3, 44, 38, 5, 47, 15, 36, 26, 26, 27, 2, 46, 4, 19, 50, 48, 49}
10-
fmt.Printf("QuickSort() = %v \n", sort.QuickSort(a, 0, len(a)-1))
11-
fmt.Printf("MergeSort() = %v \n", sort.MergeSort(a, 0, len(a)-1))
12-
fmt.Printf("HeapSort() = %v \n", sort.HeapSort(a))
11+
fmt.Printf("QuickSort() = %v \n", sort.QuickSort(append([]int{}, a...), 0, len(a)-1))
12+
fmt.Printf("MergeSort() = %v \n", sort.MergeSort(append([]int{}, a...), 0, len(a)-1))
13+
fmt.Printf("MergeSort1() = %v \n", sort.MergeSort1(append([]int{}, a...)))
14+
fmt.Printf("HeapSort() = %v \n", sort.HeapSort(append([]int{}, a...)))
15+
fmt.Printf("MaxHeap.Create1() = %v \n", heap.Create1(append([]int{}, a...)))
16+
fmt.Printf("Orange Arr = %v \n", a)
1317
}

Diff for: common/sort/mergeSort.go

+10-14
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ func MergeSort(arr []int, low, hight int) []int {
1313
}
1414

1515
func merge(arr []int, low, mid, hight int) {
16-
a := make([]int, hight-low)
17-
i, j := low, mid
18-
for i < mid && j < hight {
16+
a := make([]int, 0, hight-low)
17+
i, j := low, mid+1
18+
for i <= mid && j <= hight {
1919
if arr[i] > arr[j] {
2020
a = append(a, arr[j])
2121
j++
@@ -24,35 +24,31 @@ func merge(arr []int, low, mid, hight int) {
2424
i++
2525
}
2626
}
27-
for i < mid {
27+
for i <= mid {
2828
a = append(a, arr[i])
2929
i++
3030
}
31-
for j < hight {
31+
for j <= hight {
3232
a = append(a, arr[j])
3333
j++
3434
}
35+
for k := range a {
36+
arr[low+k] = a[k]
37+
}
3538
}
3639

3740
// MergeSort1 is another solution .
3841
// 该方法新建多个底层数组,空间浪费 .
3942
func MergeSort1(arr []int) []int {
4043
l := len(arr)
41-
if l > 2 {
44+
if l >= 2 {
4245
mid := l / 2
4346
la := MergeSort1(arr[:mid])
4447
ra := MergeSort1(arr[mid:])
4548
a := merge1(la, ra)
4649
return a
47-
} else if l == 2 {
48-
a := arr
49-
if a[0] > a[1] {
50-
a[0], a[1] = a[1], a[0]
51-
}
52-
return a
53-
} else {
54-
return []int{}
5550
}
51+
return arr
5652
}
5753

5854
func merge1(la, ra []int) []int {

Diff for: done/2018 年力扣高频 算法面试题汇总/动态规划/128.最长连续序列/readme.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
代码:
2020
``` golang
2121
func longestConsecutive(nums []int) int {
22-
mmp := make(map[int]bool, len(nums))
22+
mmp := make(map[int]bool,len(nums))
2323
for _, k := range nums {
2424
mmp[k] = true
2525
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func main() {
6+
fmt.Println(lengthOfLIS([]int{3, 5, 6, 2, 5, 4, 19, 5, 6, 7, 12}))
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
## 动态规划
2+
核心思想:用一个数组`int arr[]`辅助,`arr[i]`代表到`i`为止的最长上升子序列的长度,然后由公式`arr[i]=max(arr[j])+1`得到`arr[i]`的值,前提是`j<i`
3+
具体实现:
4+
- 每次遍历`nums[i]`,开始遍历`arr[]`,选出最大的值然后再`+1`得到最后`arr[i]`的值即可。
5+
6+
代码:
7+
``` golang
8+
func lengthOfLIS(nums []int) int {
9+
if len(nums) == 0 {
10+
return 0
11+
}
12+
max := 0
13+
arr := make([]int, len(nums))
14+
for i := range nums {
15+
tmp := 0
16+
for j := range arr {
17+
if nums[j] < nums[i] {
18+
if arr[j] > tmp {
19+
tmp = arr[j]
20+
}
21+
}
22+
}
23+
arr[i] = tmp + 1
24+
if arr[i] > max {
25+
max = arr[i] + 1
26+
}
27+
}
28+
return max
29+
}
30+
```
31+
32+
时间复杂度为O(n^2)
33+
34+
## 动归+二分
35+
原理([参考](https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-by-leetcode/)):他的方法依赖于这样一个事实,在给定数组中最长上升子序列可能达到 `i^th`,独立于后面在数组中出现的元素。因此,如果我们知道 `lis` 的长度不超过 `i^th`,我们可以根据索引为`j` 的元素包括 `(i+1)^th`元素来计算 `lis` 的长度,其中 `0≤j≤(i+1)`
36+
37+
实现:新建数组`arr`,用于保存最长上升子序列,然后遍历`nums`,对于每个元素
38+
- 如果 `arr` 中元素都比它小,将它插到最后
39+
- 否则,用它覆盖掉比它大的元素中最小的那个,具体实现采用二分搜索
40+
总之就是让`arr`中存储比较小的元素。这样,`arr`未必是真实的最长上升子序列,但长度是对的
41+
42+
代码:
43+
``` golang
44+
func lengthOfLIS(nums []int) int {
45+
if len(nums) == 0 {
46+
return 0
47+
}
48+
arr := make([]int, 0, len(nums))
49+
arr = append(arr, nums[0])
50+
for _, v := range nums[1:] {
51+
if v > arr[len(arr)-1] {
52+
arr = append(arr, v)
53+
} else {
54+
l, r := 0, len(arr)-1
55+
for l < r {
56+
mid := (l + r) / 2
57+
if arr[mid] >= v {
58+
r = mid
59+
} else {
60+
l = mid + 1
61+
}
62+
}
63+
arr[l] = v
64+
}
65+
}
66+
return len(arr)
67+
}
68+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package main
2+
3+
/*
4+
* @lc app=leetcode.cn id=300 lang=golang
5+
*
6+
* [300] 最长上升子序列
7+
*/
8+
9+
func lengthOfLIS(nums []int) int {
10+
if len(nums) == 0 {
11+
return 0
12+
}
13+
arr := make([]int, 0, len(nums))
14+
arr = append(arr, nums[0])
15+
for _, v := range nums[1:] {
16+
if v > arr[len(arr)-1] {
17+
arr = append(arr, v)
18+
} else {
19+
l, r := 0, len(arr)-1
20+
for l < r {
21+
mid := (l + r) / 2
22+
if arr[mid] >= v {
23+
r = mid
24+
} else {
25+
l = mid + 1
26+
}
27+
}
28+
arr[l] = v
29+
}
30+
}
31+
return len(arr)
32+
}

0 commit comments

Comments
 (0)