给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
js示例输入: nums = [100,4,200,1,3,2] 输出: 4 解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。 示例 2: 输入: nums = [0,3,7,2,5,8,4,6,0,1] 输出: 9 示例 3: 输入: nums = [1,0,1,2] 输出: 3
这里eino 框架学习的相关总结,方便后续学习和记忆
jsfunc main() {
head := buildList([]int{1, 2, 3, 4, 5, 6})
k := 3
fmt.Println("原链表:")
printList(head)
newHead := reverseKGroup(head, k)
fmt.Println("每K个翻转后:")
printList(newHead)
}
jsfunc main() {
// 示例:
// 1→2→3→4→5→6→7→8
head := buildList([]int{1, 2, 3, 4, 5, 6, 7, 8})
k := 3
fmt.Println("原链表:")
printList(head)
newHead := reverseKFromTail(head, k)
fmt.Println("处理后:")
printList(newHead)
}
jspackage main
import "fmt"
func quickSort(arr []int, left, right int) {
if left < right {
// 获取分区后的基准索引
pivotIndex := partition(arr, left, right)
// 递归排序左半部分
quickSort(arr, left, pivotIndex-1)
// 递归排序右半部分
quickSort(arr, pivotIndex+1, right)
}
}
func partition(arr []int, left, right int) int {
// 选择最右侧元素作为基准
pivot := arr[right]
i := left - 1 // i 指向小于基准的区域边界
for j := left; j < right; j++ {
// 如果当前元素小于或等于基准
if arr[j] <= pivot {
i++
// 交换元素
arr[i], arr[j] = arr[j], arr[i]
}
}
// 将基准值交换到中间正确的位置
arr[i+1], arr[right] = arr[right], arr[i+1]
return i + 1
}
func main() {
data := []int{34, 7, 23, 32, 5, 62}
fmt.Println("排序前:", data)
quickSort(data, 0, len(data)-1)
fmt.Println("排序后:", data)
}
jspackage main
import "fmt"
func quickSort(nums []int, left, right int) {
if left >= right {
return
}
pivot := nums[left] // 选最左作为基准
i, j := left, right
for i < j {
// 从右往左找小于 pivot 的
for i < j && nums[j] >= pivot {
j--
}
// 从左往右找大于 pivot 的
for i < j && nums[i] <= pivot {
i++
}
nums[i], nums[j] = nums[j], nums[i]
}
// 把 pivot 放到正确位置
nums[left], nums[i] = nums[i], nums[left]
quickSort(nums, left, i-1)
quickSort(nums, i+1, right)
}
func main() {
arr := []int{5, 2, 3, 1, 4}
quickSort(arr, 0, len(arr)-1)
fmt.Println(arr)
}
题目描述
jspackage main
import (
"fmt"
)
// maxSubArray 求最大连续子数组和
func maxSubArray(nums []int) int {
if len(nums) == 0 {
return 0
}
currentSum := nums[0]
maxSum := nums[0]
for i := 1; i < len(nums); i++ {
// 当前和要么接着加,要么从当前元素重新开始
if currentSum < 0 {
currentSum = nums[i]
} else {
currentSum += nums[i]
}
// 更新最大值
if currentSum > maxSum {
maxSum = currentSum
}
}
return maxSum
}
func main() {
nums := []int{-2, 1, -3, 4, -1, 2, 1, -5, 4}
result := maxSubArray(nums)
fmt.Println("最大连续子数组和为:", result)
}