双指针&滑动窗口专题

目录

3. 无重复字符的最长子串

713. 乘积小于k的子数组

209. 长度最小的子数组

42. 接雨水

11. 盛水最多的容器

167. 两数之和II-输入有序数组

15. 三数之和


3. 无重复字符的最长子串
func lengthOfLongestSubstring(s string) int {
	n := len(s)
	if n <= 1 {
		return n
	}
	dict := make(map[byte]int)
	l, r := 0, 0
	ans := 1
	for r < n {
		dict[s[r]]++
		for dict[s[r]] > 1 {
			dict[s[l]]--
			l++
		}
		ans = max(ans, r-l+1)
		r++
	}
	return ans
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}
713. 乘积小于k的子数组
func numSubarrayProductLessThanK(nums []int, k int) int {
	if k <= 1 {
		return 0
	}
	ans := 0
	product := 1
	l, r := 0, 0
	for r < len(nums) {
		product *= nums[r]
		for l <= r && product >= k {
			product /= nums[l]
			l++
		}
		ans += r - l + 1
        r++
	}
	return ans
}

func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}

209. 长度最小的子数组
func minSubArrayLen(target int, nums []int) int {
	l, r := 0, 0
	ans := len(nums) + 1
	sum := 0
	for r < len(nums) {
		sum += nums[r]
		for sum >= target {
			ans = min(ans, r-l+1)
			sum -= nums[l]
			l++
		}
		r++
	}
	if ans == len(nums)+1 {
		return 0
	}
	return ans
}

func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}
42. 接雨水
func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

func trap(height []int) int {
	n := len(height)
	left_max := make([]int, n)
	right_max := make([]int, n)
	left_max[0], right_max[n-1] = height[0], height[n-1]
	for i := 1; i < n; i++ {
		left_max[i] = max(left_max[i-1], height[i])
	}
	for j := n - 2; j >= 0; j-- {
		right_max[j] = max(right_max[j+1], height[j])
	}
	ans := 0
	for i := 0; i < n; i++ {
		ans += min(left_max[i], right_max[i]) - height[i]
	}
	return ans
}
11. 盛水最多的容器
func maxArea(height []int) int {
	l, r := 0, len(height)-1
	maxVolume := 0
	for l < r {
		if height[l] > height[r] {
			maxVolume = max(maxVolume, height[r]*(r-l))
			r--
		} else {
			maxVolume = max(maxVolume, height[l]*(r-l))
			l++
		}
	}
	return maxVolume
}
167. 两数之和II-输入有序数组
func twoSum(numbers []int, target int) []int {
	l, r := 0, len(numbers)-1
	for l < r {
		sum := numbers[l] + numbers[r]
		if sum > target {
			r--
		} else if sum < target {
			l++
		} else {
			return []int{l + 1, r + 1}
		}
	}
	return nil
}
15. 三数之和
func mergeNums(nums1, nums2 []int) []int {
	var ans []int
	i, j := 0, 0
	for i < len(nums1) && j < len(nums2) {
		if nums1[i] < nums2[j] {
			ans = append(ans, nums1[i])
			i++
		} else {
			ans = append(ans, nums2[j])
			j++
		}
	}
	ans = append(ans, nums1[i:]...)
	ans = append(ans, nums2[j:]...)
	return ans
}

func sortArray(nums []int) []int {
	if len(nums) < 2 {
		return nums
	}
	left, right := sortArray(nums[:len(nums)/2]), sortArray(nums[len(nums)/2:])
	return mergeNums(left, right)
}

func threeSum(nums []int) [][]int {
	nums = sortArray(nums)
	var ans [][]int
	l := len(nums)
	i := 0
	for i < l-2 {
		x := nums[i]
		if i > 0 && nums[i] == nums[i-1] {
			i++
			continue
		}
		target := -x
		j, k := i+1, l-1
		for j < k {
			sum := nums[j] + nums[k]
			if sum == target {
				ans = append(ans, []int{x, nums[j], nums[k]})
				j++
				for j < k && nums[j] == nums[j-1] {
					j++
				}
				k--
				for k > j && nums[k] == nums[k+1] {
					k--
				}
			} else if sum < target {
				j++
			} else if sum > target {
				k--
			}
		}
		i++
	}
	return ans
}

未完待续

  • 22
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值