//283.移动零
func moveZeroes(nums []int) {
low := 0
for fast := 0; fast < len(nums); fast++ { //把非零元素都移到前面来
if nums[fast] != 0 {
nums[low] = nums[fast]
low++
}
}
for low < len(nums) { //快指针退出后慢指针把剩余位置补0
nums[low] = 0
low++
}
}
//11.盛水最多的容器
func maxArea(height []int) int {
left, right := 0, len(height)-1 //双指针
res := 0 //存放最大面积
for left < right {//以左右两边较小的值为高,计算面积,最后移动最小值的指针
if height[left] > height[right] {
res = max(res, (right-left)*height[right])
right--
} else {
res = max(res, (right-left)*height[left])
left++
}
}
return res
}
//15.三数之和
func threeSum(nums []int) [][]int {
//对数组升序排序
sort.Ints(nums)
res := [][]int{}
//遍历数组
for i := 0; i < len(nums)-2; i++ { //注意这里是i < len(nums)-2
n1 := nums[i]
if n1 > 0 {
break
}
//先对i去重
if i > 0 && n1 == nums[i-1] {
continue
}
// 判断nums[a]+nums[left]+nums[right]与0的大小关系0然后左右移动指针
left, right := i+1, len(nums)-1
for left < right {
//先收获结果
n2, n3 := nums[left], nums[right]
if n1+n2+n3 == 0 {
res = append(res, []int{n1, n2, n3})
//对left、right去重
for left < right && n2 == nums[left] {
left++
}
for left < right && n3 == nums[right] {
right--
}
} else if n1+n2+n3 > 0 {
right--
} else {
left++
}
}
}
return res
}
//42.接雨水
func trap(height []int) int {
if len(height) <= 2 {
return 0
}
//初始化单调栈和结果集
stack := []int{0}
sum := 0
for i := 1; i < len(height); i++ {
top := stack[len(stack)-1]
if height[i] <= height[top] {
stack = append(stack, i)
} else {
for len(stack) != 0 && height[i] > height[top] {
mid := stack[len(stack)-1]
//弹出栈顶元素
stack = stack[:len(stack)-1]
if len(stack) != 0 {
top = stack[len(stack)-1]
h := min(height[i], height[top]) - height[mid]
w := i - top - 1 //注意这里w要减1
sum += h * w
}
}
stack = append(stack, i)
}
}
return sum
}