dengxinyi 6 years ago
parent
commit
ebfb083b15
2 changed files with 80 additions and 0 deletions
  1. 36 0
      medium/695.max-area-of-island.go
  2. 44 0
      medium/698.partition-to-k-equal-sum-subsets.go

+ 36 - 0
medium/695.max-area-of-island.go

@@ -0,0 +1,36 @@
+var detX = []int{1, 0, -1, 0}
+var detY = []int{0, 1, 0, -1}
+
+func maxAreaOfIsland(grid [][]int) (area int) {
+	H := len(grid)
+	if H == 0 {
+		return
+	}
+	W := len(grid[0])
+	for y := 0; y < H; y++ {
+		for x := 0; x < W; x++ {
+			area = maxInt(area, dfs(grid, W, H, x, y))
+		}
+	}
+	return
+}
+
+func dfs(grid [][]int, W, H, x, y int) (area int) {
+	if x < 0 || W <= x || y < 0 || H <= y || grid[y][x] == 0 {
+		return
+	}
+	area++
+	grid[y][x] = 0
+	for i := 0; i < 4; i++ {
+		nx, ny := x+detX[i], y+detY[i]
+		area += dfs(grid, W, H, nx, ny)
+	}
+	return
+}
+
+func maxInt(x, y int) int {
+	if x < y {
+		return y
+	}
+	return x
+}

+ 44 - 0
medium/698.partition-to-k-equal-sum-subsets.go

@@ -0,0 +1,44 @@
+type none struct{}
+
+func canPartitionKSubsets(nums []int, k int) bool {
+	sum := 0
+	for _, i := range nums {
+		sum += i
+	}
+	if sum%k != 0 {
+		return false
+	}
+	sum /= k
+	m := make(map[[3]int]none) // Use memorized search to avoid TLE
+	return dfs(nums, k, sum, 0, 0, m)
+}
+
+func dfs(nums []int, k, sum, cur, set int, m map[[3]int]none) bool {
+	if k == 0 {
+		return set == 1<<uint(len(nums))-1
+	}
+	if _, ok := m[[3]int{k, cur, set}]; ok {
+		return false
+	}
+	for i := range nums {
+		if set>>uint(i)&1 == 1 {
+			continue
+		}
+		if t := cur + nums[i]; sum < t {
+			continue
+		} else if t < sum {
+			nset := set | (1 << uint(i))
+			if dfs(nums, k, sum, t, nset, m) {
+				return true
+			}
+			m[[3]int{k, t, nset}] = none{}
+		} else {
+			nset := set | (1 << uint(i))
+			if dfs(nums, k-1, sum, 0, nset, m) {
+				return true
+			}
+			m[[3]int{k, t, nset}] = none{}
+		}
+	}
+	return false
+}