leetcode之指针方法
Posted 柳小葱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode之指针方法相关的知识,希望对你有一定的参考价值。
今天接着数组篇来讲,主要讲解指针操作数组。
1.两数之和,返回元素
如果假设输入一个数组nums和一个目标和target,请你返回nums 中能够凑出target的两个元素的值,比如输入nums =[5,3,1,6], target = 9,那么算法返回两个元素[3,6]。可以假设只有且仅有一对儿元素可以凑出target。
解决方法有很多,我们主要采用双指针解决方法.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
#上来先排序
nums.sort()
n=len(nums())
#设置指针
left=0;
right=n-1
#指针运动(因为排好序列,所以升序排列,大了就移动right小了就移动left)
while left<right:
if nums[left] +nums[right]<target:
left+=1
elif nums[left] +nums[right]>target:
right+=1
else:
return [nums[left],num[right]]
2.两数之和—返回多对元素
nums 中可能有多对儿元素之和都等于target,请你的算法返回所有和为target的元素对儿,其中不能出现重复
比如说输入为nums =[1,3,1,2,2,3], target = 4,那么算法返回的结果就是 : [[1,3],[2,2]]
这道题的结题思路同样采用双指针策略
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
#上来先排序
num.sort()
res=[]#保存结果
n=len(nums)
left=0
right=n-1
while left<right;
if nums[left]+nums[right]<target:
left+=1
elif nums[left]+nums[right]>target:
right+=1
else:
res.append([arr[left],arr[right]])
#排序之后,只要左边的指针不一样,右边的指针肯定不一样
while left<right and nums[left]==num[left+1]
left+=1
left+=1
right-=1
return res
3.三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
这道题还是用指针解法,虽然有三个数,但是我们只要固定一个数,然后在这个数的右边进行指针查找就能解决问题。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
#数组先排序
nums.sort()
res=[]#存放结果
for i in range(len(nums)):
#第一次i等于0,不会允许下面的语句,当i等于1时,就开始检查当前的元素和前一次的元素是否相等,相等则跳过则次循环
if i>0 and nums[i]=num[i-1]:
continue
#准备好指针
left=i+1#左指针就是当前元素右边那个数所以是i+1
light=len(nums)-1
while left<right:
if nums[i]+nums[left]+nums[right]<target:
left+=1
elif nums[i]+nums[left]+nums[right]>target:
right-=1
else:
#这里有个思想就是添加完符合的参数后,需要判断这个指针和后一个指针是否重复,重复的话就调跳到到最后一个重复的数值位置,再由后面的程序更新left和right
res.append([nums[i],nums[left],nums[right]])
while left<right and nums[left]==nums[lefts+1]
left+=1
left+=1
right-=1
return res
4.删除有序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
先解释一下题目,什么叫做不要使用额外的数组空间,意思就是不能够构建新的数组,然后往数组里加东西,只能在题目给定的nums删除重复项.
这里我们也采用双指针的写法,不过是一个快,一个慢,一个判断是否重复,一个给重复的元素重新赋值
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
n=len(nums)
#同向指针,一个快,一个慢,但需要从第二个元素开始
slow=fast=1
while fast<n:
if nums[fast]==num[fast-1]:
fast+=1
else:
nums[slow]=nums[fast]
fast+=1
slow+=1
return slow
5.小技巧
再介绍几个函数,对算法可能有用
s="ssdaA*asdf:afa5ADF"
a=[i for i in s]#可将字符串转换为单个字符数组
s.lower()#转化为小写
nums.sort()#排序(升序)
.isalpha()#判断字符是否为字母
.isnumeric()#判断字符是否为数字
参考资料
- 链接: Leetcode—5.n sum 问题python解答.
- Leetcode: Leetcode官网.
以上是关于leetcode之指针方法的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode快速入门之第二节课: 使用双指针+区间法解决数组问题