1. 程式人生 > 資訊 >上海:將對快遞費和跑腿費價格明顯上漲的問題採取措施

上海:將對快遞費和跑腿費價格明顯上漲的問題採取措施

小技巧

計算中間值(防止溢位)

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
}