leetcode 27
This commit is contained in:
commit
d9343a0093
|
@ -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
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="Go" enabled="true" />
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/leetcode-go.iml" filepath="$PROJECT_DIR$/.idea/leetcode-go.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
|
@ -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() {}
|
|
@ -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() {
|
||||
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 150 KiB |
|
@ -0,0 +1,4 @@
|
|||
# Binary Search
|
||||
> 二元搜尋的方法
|
||||
|
||||
給訂一組陣列,以及給一個數字,給出這個target 在陣列中的位置,沒有救回-1
|
|
@ -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)
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 158 KiB |
Binary file not shown.
After Width: | Height: | Size: 495 KiB |
|
@ -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)
|
Loading…
Reference in New Issue