力扣-使用双指针的方法的题们(持续更新中。。。
目录
一.两数之和
1.题目
2.灵神的视频题解
3.代码
二.移动零
1.题目
2.B站博主的视频题解
3.代码
三.盛最多水的容器
1.题目
2.灵神的视频题解
3.代码
一.两数之和
1.题目
167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)
2.灵神的视频题解
【两数之和 三数之和【基础算法精讲 01】-哔哩哔哩】 https://b23.tv/ukJ08aw
采用双指针方法的解题关键点【大于移动大指针,小于移动小指针】:指针初始化指向首尾,首尾指针之和>Target,(说明里面大的那个数和其他的数只会更大),所以移动大数的指针;同理首尾指针之和<Target,(说明里面小的那个数和其他的数只会更小),所以移动小数的指针。
3.代码
class Solution(object):def twoSum(self, numbers, target):""":type numbers: List[int]:type target: int:rtype: List[int]"""left=0right=len(numbers)-1while left<right:if (numbers[left]+numbers[right])>target:right-=1elif (numbers[left]+numbers[right])<target:left+=1else:return [left+1,right+1]
二.移动零
1.题目
283. 移动零 - 力扣(LeetCode)
2.B站博主的视频题解
【【力扣hot100】【LeetCode 283】移动零|双指针-哔哩哔哩】 https://b23.tv/O40RUfW
不同于正向思考将零移动到末尾,反向思考,将所以非零数交换移动到最后一个非零指针指向的位置,双指针,一个指针遍历数组,一个指针指向最后一个非零位置
3.代码
class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""last_zero=0for i in range(len(nums)):if nums[i]!=0:nums[last_zero],nums[i]=nums[i],nums[last_zero]last_zero+=1print(nums)
三.盛最多水的容器
1.题目
11. 盛最多水的容器 - 力扣(LeetCode)
2.灵神的视频题解
【盛最多水的容器 接雨水【基础算法精讲 02】-哔哩哔哩】 https://b23.tv/FORgr9h
思路:
思路:还是双指针,老思路,一个最左一个最有指针,开始分析:
1)假设固定左右指针,因为是短板问题,长版的指针如果往中间移动,水的高度不会变,宽度变小,容积一定变小,所以不能移动长的指针;但是把短的指针往中间移动,水的高度可能增加,虽然宽度变小,所以容积有可能增加。
2)所以我们保留历史最大容积 ,把左右开始往中间移动的双指针,每次把长度短的那个往中间移动。
3.代码
class Solution(object):def maxArea(self, height):""":type height: List[int]:rtype: int"""ans=0lenth=len(height)L=0R=lenth-1while L<R:area=(R - L) * min(height[L], height[R])if height[L]<height[R]:L+=1else:R-=1ans=max(ans,area)return ans