文章目录
leetcode之遍历系列算法
1.按键时间最长的键
1.1一次遍历
func slowestKey(releaseTimes []int, keysPressed string) byte {
ans := keysPressed[0]
maxTime := releaseTimes[0]
for i := 1; i < len(keysPressed); i++ {
key := keysPressed[i]
time := releaseTimes[i] - releaseTimes[i-1]
if time > maxTime ||(time == maxTime && key > ans) {
ans = key
maxTime = time
}
}
return ans
}

2.切片最大值及索引
package main
import (
"fmt"
)
func main() {
intArr := []int{3, -4, 93, 8, 12, 29}
maxVal := intArr[0]
maxValIndex := 0
for i := 0; i < len(intArr); i++ {
if maxVal < intArr[i] {
maxVal = intArr[i]
maxValIndex = i
}
}
fmt.Println(maxVal, maxValIndex)
}

3.切片最小值及索引
package main
import (
"fmt"
)
func main() {
intArr := []int{3, -4, 93, 8, 12, 29}
maxVal := intArr[0]
maxValIndex := 0
for i := 0; i < len(intArr); i++ {
if maxVal > intArr[i] {
maxVal = intArr[i]
maxValIndex = i
}
}
fmt.Println(maxVal, maxValIndex)
}
4.至少是其他数字两倍的最大数
4.1一次遍历
func dominantIndex(nums []int) int {
if len(nums)<=1{
return 0
}
lastMax,max:=0,nums[0]
maxIndex:=0
for i:=1;i<len(nums);i++{
if nums[i]>max{
lastMax=max
max=nums[i]
maxIndex=i
}else if nums[i]>lastMax{
lastMax=nums[i]
}
}
if max>=lastMax*2{
return maxIndex
}
return -1
}

5.递增的三元子序列
5.1双向遍历
func increasingTriplet(nums []int) bool {
n := len(nums)
if n < 3 {
return false
}
leftMin := make([]int, n)
leftMin[0] = nums[0]
for i := 1; i < n; i++ {
leftMin[i] = min(leftMin[i-1], nums[i])
}
rightMax := make([]int, n)
rightMax[n-1] = nums[n-1]
for i := n - 2; i >= 0; i-- {
rightMax[i] = max(rightMax[i+1], nums[i])
}
for i := 1; i < n-1; i++ {
if nums[i] > leftMin[i-1] && nums[i] < rightMax[i+1] {
return true
}
}
return false
}
func min(a, b int) int {
if a > b {
return b
}
return a
}
func max(a, b int) int {
if b > a {
return b
}
return a
}
