使用雙指標法查詢給定和的最長子陣列的 Golang 程式


在這篇 Go 語言文章中,我們將使用迭代和最佳化迭代方法,透過雙指標法來查詢給定和的最長子陣列。陣列是由相同資料型別元素組成的集合,這些元素排列在記憶體的連續塊中,並且可以使用索引或下標進行訪問。

使用迭代方法的雙指標法

在這種方法中,我們將使用迭代方法定義一個 longestSubarray() 函式,該函式用於使用雙指標法查詢給定和的最長子陣列。

演算法

  • 步驟 1 − 首先,我們需要匯入 fmt 包。

  • 步驟 2 − 啟動 main() 函式。在 main() 函式內部,初始化一個數組並提供整數和值。

  • 步驟 3 − 現在,呼叫 longestSubarray() 函式並將陣列和和作為引數傳遞給它。

  • 步驟 4 − 此外,使用 fmt.Println() 函式列印結果的最長子陣列值。

  • 步驟 5 − 現在,建立一個 longestSubarray() 函式,該函式以整數陣列和一個和值作為輸入。此函式將返回具有給定和的最長子陣列。

  • 步驟 6 − 在 longestSubarray() 函式中,檢查陣列的長度。如果它為 0,則函式返回 nil。

  • 步驟 7 − 該函式使用從 0 開始的索引 end 迴圈遍歷陣列的每個元素。在每次迭代中,arr[end] 的值都會新增到 currSum 中。

  • 步驟 8 − 最終,在比較之後,返回具有給定和的結果最長子陣列。

示例

以下是使用迭代方法的雙指標法查詢給定和的最長子陣列的 Go 語言程式

package main

import "fmt"

func main() {
   arr := []int{10, 50, 20, 70, 10, 90}
   sum := 90
   subarr := longestSubarray(arr, sum)
   fmt.Println("Longest subarray with the sum of", sum, "is", subarr)
}

func longestSubarray(arr []int, sum int) []int {
   n := len(arr)
   if n == 0 {
      return nil
   }

   maxLen := 0
   maxStart, maxEnd := -1, -1
   currSum, start := 0, 0

   for end := 0; end < n; end++ {
      currSum += arr[end]

      for currSum > sum && start <= end {
         currSum -= arr[start]
         start++
      }

      if currSum == sum && end-start+1 > maxLen {
         maxLen = end - start + 1
         maxStart, maxEnd = start, end
      }
   }

   if maxStart == -1 {
      return nil
   }
   return arr[maxStart : maxEnd+1]
}

輸出

Longest subarray with the sum of 90 is [20 70]

使用最佳化迭代方法的雙指標法

在此示例中,我們將使用最佳化迭代方法定義一個 longestSubarrayWithGivenSum() 函式,該函式用於使用雙指標法查詢給定和的最長子陣列。

演算法

  • 步驟 1 − 首先,我們需要匯入 fmt 包。

  • 步驟 2 − 首先,建立一個 longestSubarrayWithGivenSum() 函式,該函式以整數陣列和目標和值作為輸入。此函式將返回具有給定和的最長子陣列。

  • 步驟 3 − 該函式使用兩個指標 left 和 right 來跟蹤起始和結束索引。

  • 步驟 4 − 它將右指標向右移動,同時將每個元素新增到 currentSum 中。如果 currentSum 大於 targetSum,則該函式將左指標向右移動,並從 currentSum 中減去每個元素,直到 currentSum 小於或等於 targetSum。

  • 步驟 5 − 最終,在比較之後,返回具有給定和的結果最長子陣列。

  • 步驟 6 − 啟動 main() 函式。在 main() 函式內部,初始化一個數組並提供整數目標和值。

  • 步驟 7 − 現在,呼叫 longestSubarray() 函式並將陣列和和作為引數傳遞給它。

  • 步驟 8 − 然後,如果存在,它將列印具有給定和的最長子陣列,或者列印一條訊息,指示不存在具有給定和的子陣列。

示例

以下是使用最佳化迭代方法的雙指標法查詢給定和的最長子陣列的 Go 語言程式

package main

import "fmt"

func longestSubarrayWithGivenSum(arr []int, targetSum int) []int {
   var result []int
   var left, right, currentSum int

   for right < len(arr) {
      currentSum += arr[right]

      for currentSum > targetSum {
         currentSum -= arr[left]
         left++
      }

      if currentSum == targetSum && (result == nil || len(result) < right-left+1) {
         result = arr[left : right+1]
      }
      right++
   }
   return result
}

func main() {
   arr := []int{10, 40, 20, 30, 10, 50}
   targetSum := 70

   longestSubarray := longestSubarrayWithGivenSum(arr, targetSum)

   if longestSubarray == nil {
      fmt.Println("No subarray found with the given sum")
   } else {
      fmt.Println("Longest subarray with the given sum:", longestSubarray)
   }
}

輸出

Longest subarray with the given sum: [10 40 20]

結論

我們已經成功編譯並執行了一個 Go 語言程式,該程式使用迭代和最佳化迭代方法的雙指標法查詢給定和的最長子陣列,以及兩個示例。在第一個示例中,我們使用了迭代方法,在第二個示例中,我們使用了最佳化迭代方法。

更新於: 2023年4月3日

246 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.