dengxinyi 6 gadi atpakaļ
vecāks
revīzija
3393b82438

+ 26 - 0
medium/540.single-element-in-a-sorted-array.go

@@ -0,0 +1,26 @@
+func singleNonDuplicate(nums []int) int {
+	n := len(nums)
+	if n == 0 {
+		return 0
+	}
+	beg, end := 0, n-1
+	for beg < end { // Binary search
+		mid := beg + (end-beg)/2
+		if nums[mid] == nums[mid+1] {
+			if (mid-beg)&1 == 1 {
+				end = mid - 1
+			} else {
+				beg = mid + 2
+			}
+		} else {
+			if mid == 0 || nums[mid-1] != nums[mid] {
+				return nums[mid]
+			} else if (end-mid)&1 == 1 {
+				beg = mid + 1
+			} else {
+				end = mid - 2
+			}
+		}
+	}
+	return nums[beg]
+}

+ 53 - 0
medium/542.01-matrix.go

@@ -0,0 +1,53 @@
+var dy []int = []int{0, 1, 0, -1}
+var dx []int = []int{1, 0, -1, 0}
+
+type pair struct {
+	_1 int
+	_2 int
+}
+
+func updateMatrix(matrix [][]int) [][]int {
+	m := len(matrix)
+	if m == 0 {
+		return matrix
+	}
+	n := len(matrix[0])
+	if n == 0 {
+		return matrix
+	}
+	updated := make([][]bool, m)
+	for i := range updated {
+		updated[i] = make([]bool, n)
+	}
+	queue := make([]pair, 0)
+	for y := 0; y < m; y++ {
+		for x := 0; x < n; x++ {
+			if matrix[y][x] == 0 {
+				updated[y][x] = true
+				continue
+			}
+			for i := 0; i < 4; i++ {
+				ny, nx := y+dy[i], x+dx[i]
+				if 0 <= ny && ny < m && 0 <= nx && nx < n && matrix[ny][nx] == 0 {
+					updated[y][x] = true
+					queue = append(queue, pair{y, x})
+					break
+				}
+			}
+		}
+	}
+	for len(queue) != 0 {
+		p := queue[0]
+		queue = queue[1:]
+		val := matrix[p._1][p._2]
+		for i := 0; i < 4; i++ {
+			ny, nx := p._1+dy[i], p._2+dx[i]
+			if 0 <= ny && ny < m && 0 <= nx && nx < n && !updated[ny][nx] {
+				updated[ny][nx] = true
+				queue = append(queue, pair{ny, nx})
+				matrix[ny][nx] = val + 1
+			}
+		}
+	}
+	return matrix
+}

+ 35 - 0
medium/547.friend-circles.go

@@ -0,0 +1,35 @@
+func findCircleNum(M [][]int) int {
+	n := len(M)
+	if n == 0 {
+		return 0
+	}
+	adj := make([][]int, n) // Much faster than the matrix M
+	for i := 0; i < n; i++ {
+		for j := i; j < n; j++ {
+			if M[i][j] == 1 {
+				adj[i] = append(adj[i], j)
+				if i != j {
+					adj[j] = append(adj[j], i)
+				}
+			}
+		}
+	}
+	visited := make([]bool, n)
+	cnt := 0
+	for i := range adj {
+		if !visited[i] && len(adj[i]) != 0 {
+			dfs(adj, &visited, i)
+			cnt++
+		}
+	}
+	return cnt
+}
+
+func dfs(adj [][]int, visited *[]bool, i int) {
+	(*visited)[i] = true
+	for _, v := range adj[i] {
+		if !(*visited)[v] {
+			dfs(adj, visited, v)
+		}
+	}
+}