Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 32bb718

Browse files
author
chen-shiwei
committed
feat: 46、47
1 parent 4a33ec9 commit 32bb718

File tree

6 files changed

+208
-0
lines changed

6 files changed

+208
-0
lines changed

‎leetcode/46.全排列/permute.go‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package _6_全排列
2+
3+
func permute(nums []int) [][]int {
4+
var (
5+
paths [][]int
6+
path []int
7+
used = make([]bool, len(nums))
8+
fn func(nums []int)
9+
)
10+
11+
fn = func(nums []int) {
12+
if len(path) == len(nums) {
13+
tmp := make([]int, len(nums))
14+
copy(tmp, path)
15+
paths = append(paths, tmp)
16+
return
17+
}
18+
19+
for i := 0; i < len(nums); i++ {
20+
if used[i] {
21+
continue
22+
}
23+
path = append(path, nums[i])
24+
used[i] = true
25+
fn(nums)
26+
used[i] = false
27+
path = path[:len(path)-1]
28+
}
29+
}
30+
fn(nums)
31+
32+
return paths
33+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package _6_全排列
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func Test_permute(t *testing.T) {
9+
type args struct {
10+
nums []int
11+
}
12+
tests := []struct {
13+
name string
14+
args args
15+
want [][]int
16+
}{
17+
{name: `输入:nums = [1,2,3]
18+
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]`, args: args{nums: []int{
19+
1, 2, 3,
20+
}}, want: [][]int{
21+
{1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1},
22+
}},
23+
}
24+
for _, tt := range tests {
25+
t.Run(tt.name, func(t *testing.T) {
26+
if got := permute(tt.args.nums); !reflect.DeepEqual(got, tt.want) {
27+
t.Errorf("permute() = %v, want %v", got, tt.want)
28+
}
29+
})
30+
}
31+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package _7_全排列II
2+
3+
import "sort"
4+
5+
func permuteUnique(nums []int) [][]int {
6+
var (
7+
paths [][]int
8+
path []int
9+
used = make([]bool, len(nums))
10+
fn func(nums []int)
11+
)
12+
13+
fn = func(nums []int) {
14+
if len(nums) == len(path) {
15+
tmp := make([]int, len(path))
16+
copy(tmp, path)
17+
paths = append(paths, tmp)
18+
return
19+
}
20+
21+
for i := 0; i < len(nums); i++ {
22+
// used[i-1] == true 同一树枝使用过
23+
// used[i-1] == false 同一树层使用过
24+
if i > 0 && nums[i] == nums[i-1] && !used[i-1] {
25+
continue
26+
}
27+
if !used[i] {
28+
continue
29+
}
30+
path = append(path, nums[i])
31+
used[i] = true
32+
fn(nums)
33+
used[i] = false
34+
path = path[:len(path)-1]
35+
}
36+
}
37+
sort.Ints(nums)
38+
fn(nums)
39+
return paths
40+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package _7_全排列II
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func Test_permuteUnique(t *testing.T) {
9+
type args struct {
10+
nums []int
11+
}
12+
tests := []struct {
13+
name string
14+
args args
15+
want [][]int
16+
}{
17+
{name: `输入:nums = [1,1,2]
18+
输出:
19+
[[1,1,2],
20+
[1,2,1],
21+
[2,1,1]]`, args: args{nums: []int{1, 1, 2}}, want: [][]int{
22+
{1, 1, 2},
23+
{1, 2, 1},
24+
{2, 1, 1},
25+
}},
26+
}
27+
for _, tt := range tests {
28+
t.Run(tt.name, func(t *testing.T) {
29+
if got := permuteUnique(tt.args.nums); !reflect.DeepEqual(got, tt.want) {
30+
t.Errorf("permuteUnique() = %v, want %v", got, tt.want)
31+
}
32+
})
33+
}
34+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package _91_递增子序列
2+
3+
// 不能排序去重,用map 去重,
4+
func findSubsequences(nums []int) [][]int {
5+
var (
6+
paths [][]int
7+
path []int
8+
fn func(nums []int, startIdx int)
9+
)
10+
11+
fn = func(nums []int, startIdx int) {
12+
13+
if len(path) >= 2 {
14+
tmp := make([]int, len(path))
15+
copy(tmp, path)
16+
paths = append(paths, tmp)
17+
if startIdx >= len(nums) {
18+
return
19+
}
20+
}
21+
22+
var used = make(map[int]bool)
23+
for i := startIdx; i < len(nums); i++ {
24+
// 不能排序去重,用map 去重,
25+
if len(path) != 0 && path[len(path)-1] > nums[i] /*判断递增*/ || used[nums[i]] {
26+
continue
27+
}
28+
used[nums[i]] = true
29+
path = append(path, nums[i])
30+
fn(nums, i+1)
31+
used[i] = false
32+
path = path[:len(path)-1]
33+
}
34+
35+
}
36+
37+
fn(nums, 0)
38+
39+
return paths
40+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package _91_递增子序列
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func Test_findSubsequences(t *testing.T) {
9+
type args struct {
10+
nums []int
11+
}
12+
tests := []struct {
13+
name string
14+
args args
15+
want [][]int
16+
}{
17+
{name: `输入:[4, 6, 7, 7]
18+
输出:[[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]`, args: args{nums: []int{4, 6, 7, 7}}, want: [][]int{
19+
{4, 6}, {4, 7}, {4, 6, 7}, {4, 6, 7, 7}, {6, 7}, {6, 7, 7}, {7, 7}, {4, 7, 7},
20+
}},
21+
{name: `44321`, args: args{nums: []int{4, 4, 3, 2, 1}}, want: [][]int{{4, 4}}},
22+
}
23+
for _, tt := range tests {
24+
t.Run(tt.name, func(t *testing.T) {
25+
if got := findSubsequences(tt.args.nums); !reflect.DeepEqual(got, tt.want) {
26+
t.Errorf("findSubsequences() = %v, want %v", got, tt.want)
27+
}
28+
})
29+
}
30+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /