commit d9343a0093a1f62872a2bd9edc2fd0da07054c58 Author: daniel.w Date: Tue Nov 12 11:26:09 2024 +0800 leetcode 27 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/leetcode-go.iml b/.idea/leetcode-go.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/leetcode-go.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..a840c00 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/code-master/array/27_remove_index/main.go b/code-master/array/27_remove_index/main.go new file mode 100644 index 0000000..0de98a7 --- /dev/null +++ b/code-master/array/27_remove_index/main.go @@ -0,0 +1,21 @@ +package main + +func removeElement(nums []int, val int) int { + // 新陣列的邊界 + slowPtr := 0 + + // 快指針,要獲取新陣列的元素 + for fastPointer := 0; fastPointer < len(nums); fastPointer++ { + // 如果下一個元素不是我們要排除的 + if nums[fastPointer] != val { + // 將元素加到我們的新的陣列中 + nums[slowPtr], nums[fastPointer] = nums[fastPointer], nums[slowPtr] + // 擴容邊界 + slowPtr++ + } + } + + return slowPtr +} + +func main() {} diff --git a/code-master/array/704_binrary_search/main.go b/code-master/array/704_binrary_search/main.go new file mode 100644 index 0000000..fd3c0e1 --- /dev/null +++ b/code-master/array/704_binrary_search/main.go @@ -0,0 +1,31 @@ +package main + +func search(nums []int, target int) int { + // 如果沒有傳入就先回傳了 + if len(nums) == 0 { + return -1 + } + + left, right := 0, len(nums)-1 + + for right >= left { + mid := left + (right-left)>>1 + if nums[mid] > target { + right = mid - 1 + } + + if nums[mid] < target { + left = mid + 1 + } + + if nums[mid] == target { + return mid + } + } + + return -1 +} + +func main() { + +} diff --git a/code-master/array/704_binrary_search/picture.png b/code-master/array/704_binrary_search/picture.png new file mode 100644 index 0000000..a586b77 Binary files /dev/null and b/code-master/array/704_binrary_search/picture.png differ diff --git a/code-master/array/704_binrary_search/readme.md b/code-master/array/704_binrary_search/readme.md new file mode 100644 index 0000000..ae9a943 --- /dev/null +++ b/code-master/array/704_binrary_search/readme.md @@ -0,0 +1,4 @@ +# Binary Search +> 二元搜尋的方法 + +給訂一組陣列,以及給一個數字,給出這個target 在陣列中的位置,沒有救回-1 \ No newline at end of file diff --git a/maximum_subarray/kadane's_algorithm.go b/maximum_subarray/kadane's_algorithm.go new file mode 100644 index 0000000..1344541 --- /dev/null +++ b/maximum_subarray/kadane's_algorithm.go @@ -0,0 +1,32 @@ +package main + +import ( + "fmt" + "math" +) + +// maxSubArray 給訂一組數字找到一組子陣列,這組子陣列的總和是最大的,最後 return 總和。 + +func maxSubArray(nums []int) int { + // 先定義目前最大的數字,最後就回傳這個數字 + maxSum := math.MinInt + tmpSum := 0 + + for _, item := range nums { + tmpSum += item + // 更新 maxSum 為當前最大的子陣列和 + maxSum = max(maxSum, tmpSum) + // 如果 tmpSum 小於 0,則重置為 0,從下一個元素重新開始累加 + if tmpSum < 0 { + tmpSum = 0 + } + } + + return maxSum +} + +func main() { + nums := []int{-2, 1, -3, 4, -1, 2, 1, -5, 4} + + fmt.Println(maxSubArray(nums), maxSubArray(nums) == 6) +} diff --git a/maximum_subarray/picture.png b/maximum_subarray/picture.png new file mode 100644 index 0000000..a2e0ac9 Binary files /dev/null and b/maximum_subarray/picture.png differ diff --git a/maximum_subarray/picture2.png b/maximum_subarray/picture2.png new file mode 100644 index 0000000..7ef1fa7 Binary files /dev/null and b/maximum_subarray/picture2.png differ diff --git a/maximum_subarray/readme.md b/maximum_subarray/readme.md new file mode 100644 index 0000000..98dc639 --- /dev/null +++ b/maximum_subarray/readme.md @@ -0,0 +1,46 @@ +# Maximum Subarray +> 題目(通常被稱為最大子陣列和問題) + +主要考察的是下列的概念 +1. 動態規劃 +2. 分治法 + +並且它還有一個很著名的算法:Kadane’s Algorithm。以下是該題的重點考察概念和解法 + + +## 動態規劃 + +* 題目的關鍵在於找到一個連續子陣列,使其和最大。 + 動態規劃的核心思路是使用遞推方式,逐步找到每個位置的最優解。 +* 定義一個動態規劃數組 dp[i],表示以 nums[i] 結尾的最大子陣列和。遞推關係為 +```api + dp[i] = max(nums[i], dp[i-1] + nums[i]) +``` +* 如果前一段(即 dp[i-1])的和加上 nums[i] 還比 nums[i] 自己大,則可以包含 dp[i-1];否則,就從 nums[i] 開始重新計算子陣列。 +* 最後的答案是 dp 數組中的最大值。 + +## 分治法 + + • 另一個可行的解法是使用分治法,類似於歸併排序,將數組分成兩半,分別求解左半部分、右半部分和跨越中間的最大子陣列。 + • 這種方法的時間複雜度為 O(n log n),不如 Kadane’s Algorithm 高效,但有助於理解分治的思想。 + + +## 題目 +[連結](https://leetcode.com/problems/maximum-subarray/description/) + +![image](picture.png) + +## 自己的理解 + +### 題目解釋 + +給訂一組數字找到一組子陣列,這組子陣列的總和是最大的,最後 return 總和。 +```go + nums := []int{-2, 1, -3, 4, -1, 2, 1, -5, 4} +``` +在每個迭代中: + + 1. tmpSum += item,將當前元素加到當前子陣列的和中。 + 2. 使用 maxSum = max(maxSum, tmpSum) 更新最大和。 + 3. 如果 tmpSum < 0,則將 tmpSum 重置為 0,因為負數會拖累之後的累加結果。 +![image](picture2.png)