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之指针方法的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode快速入门之第二节课: 使用双指针+区间法解决数组问题

LeetCode刷题总结之双指针法

从活动调用片段方法时出现空指针异常

方法 oncreateview 中片段中 listview.setadapter() 的空指针异常

片段中的空指针异常

leecode题型整理之双指针