上海:將對快遞費和跑腿費價格明顯上漲的問題採取措施
阿新 • • 發佈:2022-04-13
小技巧
計算中間值(防止溢位)
mid = low + (high - low) / 2
向上取整
10 / 5 = 2
12 / 5 = 3
res = (a - 1)/b + 1
dfs
適用於路徑探索。
使用vis陣列的條件是,存在不同路徑匯聚的情況,避免一個節點被訪問多次。
在呼叫dfs函式之前,重置路徑,路徑上加入起點。
bfs
適用於連通性測試。
程式碼模板(包含四個變數)
func bfs() { // 首節點設定成已訪問 var vis [110]bool vis[1] = true // 首節點入佇列 var que [110]int que[0] = 1 // 設定開始的下標和佇列元素數量 beginIndex := 0 beginCount := 1 // 只要佇列還有元素就一直迭代 for beginCount > 0 { // 新新增的元素數量入佇列的開始下標 nextIndex := beginIndex + beginCount // 新新增的元素數量,即下一層元素數量 nextCount := 0 for i := 0; i < beginCount; i++ { index := que[i + beginIndex] ... if childCount == 0 { ... } else { for j := 0; j < childCount; j++ { next := childList[index][j] if !vis[next] { vis[next] = true // 新元素入佇列 que[nextIndex] = next nextIndex++ nextCount++ } } } } // 更新佇列元素數量和開始的下標 beginIndex += beginCount beginCount = nextCount } }
二分查詢
函式binarySearch表示傳統的二分查詢,沒有找到時返回-1。
函式lowerBound表示尋找第一個值>=目標值對應的下標,沒有找到時返回長度。
函式upperBound表示尋找第一個值>目標值對應的下標,沒有找到時返回長度。
package main import "fmt" func binarySearch(nums []int, goal int) int { low := 0 high := len(nums) - 1 for low <= high { mid := low + (high - low) / 2 if nums[mid] == goal { return mid } else if nums[mid] > goal { high = mid - 1 } else { low = mid + 1 } } return -1 } func lowerBound(nums []int, goal int) int { low := 0 high := len(nums) for low < high { mid := low + (high - low) / 2 if nums[mid] >= goal { high = mid } else { low = mid + 1 } } return high } func upperBound(nums []int, goal int) int { low := 0 high := len(nums) for low < high { mid := low + (high - low) / 2 if nums[mid] > goal { high = mid } else { low = mid + 1 } } return high } func main() { nums := []int{1, 3, 5, 7, 8, 9} fmt.Println(binarySearch(nums, 8)) // 4 fmt.Println(lowerBound(nums, 1)) // 0 fmt.Println(upperBound(nums, 6)) // 3 }