目录
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
}
未完待续