双指针法的应用场景

这篇具有很好参考价值的文章主要介绍了双指针法的应用场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、二分查找

二、移除元素

三、x的平方根

四、删除链表的倒数第N个节点

五、长度最小的子数组

六、链表相交

七、反转字符串

八、环形链表II

九、三数之和

十、四数之和


一、二分查找

题目地址:力扣

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left = 0
        right = len(nums)-1
        while left<=right:
            middle = (left+right)//2
            guess = nums[middle]
            if guess == target:
                return middle
                # break
            elif guess > target:
                right = middle-1
            else:
                left = middle+1
        return -1

二、移除元素

题目地址:力扣

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        length = len(nums)
        left = 0
        for right in range(length):
            if nums[right] != val:
                nums[left] = nums[right]
                left = left+1
        return left

三、x的平方根

题目地址:力扣

class Solution:
    def mySqrt(self, x : int ) -> int:
        if x == 0:
            return 0
        left = 1
        right = x
        while left <= right:
            mid = (left + right)//2
            if mid**2 == x :
                return int(mid)
            elif mid**2 > x:
                right = mid
            else:
                if (mid + 1) ** 2 > x:
                    return math.floor(mid)
                else:
                    left = mid

四、删除链表的倒数第N个节点

题目地址:力扣

class Solution:
    def removeNthFromEnd(self,head:Optional[ListNode],n:int)->Optional[ListNode]:
        dummy_head = ListNode(next=head)
        fast = dummy_head
        slow = dummy_head
        for i in range(n):
            fast = fast.next
        while fast.next:
            fast = fast.next
            slow = slow.next
        slow.next = slow.next.next
        return dummy_head.next

五、长度最小的子数组

题目地址:力扣

class Solution:
    def minSubArrayLen(self,target:int,nums:List[int])->int:
        left = 0
        right = 0
        length = len(nums)
        min_len = length+1
        cur_sum = 0

        for i in range(length):
        # while right < length:
            cur_sum = cur_sum + nums[right]
            while cur_sum >= target:
                min_len = min(right - left + 1 , min_len)
                cur_sum -= nums[left]
                left = left + 1
            right = right + 1
        return min_len if min_len != length+1 else 0

六、链表相交

class Solution:
    def getIntersectionNode(self, headA:ListNode, headB:ListNode) -> ListNode:
        curA = headA
        curB = headB
        while curB != curA:
            curA = curA.next if curA else headB
            curB = curB.next if curB else headA
        return curB

七、反转字符串

题目地址:力扣

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        left, right = 0, len(s) - 1
        
        # 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(len(s)//2)更低
        # 因为while每次循环需要进行条件判断,而range函数不需要,直接生成数字,因此时间复杂度更低。推荐使用range
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1

八、环形链表II

题目地址:力扣

class Solution:
    def detectCycle(self,head:ListNode)->ListNode:
        slow = head
        fast = head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
            
            if slow == fast:
                slow = head
                while slow != fast:
                    slow = slow.next
                    fast = fast.next
                return slow
        return None

九、三数之和

题目地址:力扣

class Solution:
    def threeSum(self, nums:List[int])->List[List[int]]:
        length = len(nums)
        # right = length - 1
        res = []
        nums.sort()
        for i in range(length - 2):
            # 如果第一个元素已经大于0,不需要进一步检查
            if nums[i] > 0:
                return res
            left = i + 1
            right = length - 1
            # 跳过相同元素以避免重复
            if i > 0 and nums[i] == nums[i-1]:
                continue

            while left < right:
                if nums[i] + nums[left] + nums[right] > 0:
                    right -= 1
                elif nums[i] + nums[left] + nums[right] < 0:
                    left += 1
                else:
                    res.append([nums[i], nums[left], nums[right]])
                    # 跳过相同的元素以避免重复
                    while right > left and nums[right] == nums[right - 1]:
                        right -= 1
                    while right > left and nums[left] == nums[left + 1]:
                        left += 1
                    right -= 1
                    left += 1
        return res

十、四数之和

题目地址:力扣文章来源地址https://www.toymoban.com/news/detail-509915.html

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        res = []
        length = len(nums)
        nums.sort()
        for i in range(length):
            # 剪枝
            if nums[i] > target and target > 0:
                break
            # 去重
            if i > 0 and nums[i] == nums[i-1]:
                continue

            for j in range(i+1, length):
                if j > i+1 and nums[j] == nums[j - 1]:
                    continue
                left = j+1
                right = length - 1
                while left < right:
                    if nums[i] + nums[j] + nums[left] + nums[right] > target:
                        right -= 1
                    elif nums[i] + nums[j] + nums[left] + nums[right] < target:
                        left += 1
                    else:
                        res.append([nums[i], nums[j], nums[left], nums[right]])
                        while left < right and nums[left] == nums[left + 1]:
                            left += 1
                        while left < right and nums[right] == nums[right - 1]:
                            right -= 1
                        right -= 1
                        left += 1
        return res

到了这里,关于双指针法的应用场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 快速排序【hoare版本】【挖坑法】【双指针法】(数据结构)

           快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复

    2024年01月16日
    浏览(37)
  • c语言快速排序(霍尔法、挖坑法、双指针法)图文详解

      快速排序是一种非常常用的排序方法,它在1962由C. A. R. Hoare(霍尔)提的一种二叉树结构的交换排序方法,故因此它又被称为 霍尔划分 ,它基于分治的思想,所以整体思路是递归进行的。 1.先选取一个key,关于key值的选取,一般是选数组第一个元素,数组中间元素,数组

    2024年02月02日
    浏览(35)
  • 算法-二分查找、移除元素

    伪装成一个老手! 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 来源:力扣二分查找 1. Q1: 为

    2024年02月10日
    浏览(49)
  • 704.二分查找 27.移除元素

    LeetCode 704 二分查找 1.左闭右开   2.左闭右闭     思路: 一(左闭右开):因为是左闭右开的区间,rigth指针的位置为待查找数组的右边界下一个位置,所以当 left right 的状态代表我们的数组还没查尽。 二(左闭右闭):因为是左闭右闭的区间,rigth指针的位置为待查找数组

    2024年02月13日
    浏览(43)
  • Leetcode 704.二分查找、27.移除元素

    暴力循环: 自己的思路 从左往右,遍历每个元素。 检查当前元素是否满足要求。 若满足要求则返回当前元素的下标。 时间复杂度:O(n); 空间复杂度:O(n); 二分查找: 题目给定的是一个升序的数组,即有序数组! 那么二分的前提是有序(或者具有某种特殊的性质!)。

    2024年02月17日
    浏览(51)
  • # - LeetCode 704-二分查找 |LeetCode 27-移除元素

    ##  LeetCode 704-二分查找 -题目描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target , -写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  , 写一个函数搜索 nums

    2024年02月16日
    浏览(53)
  • 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)

    二分查找到目标值然后左右找到坐标 问题在于:找左右坐标的时候时间复杂度不是 O(logN) 之前提到过二分查找不仅可找到相等的数值,更关键的是 它可以将数组分为截然不同的两种情况 ,因此我们可以借助这个性质找到 第一个大于等于 target 的值(左下标) 和 第一个大于

    2024年01月22日
    浏览(53)
  • 二分查找:34. 在排序数组中查找元素的第一个和最后一个位置

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》《算法》 本篇文章仅是作为小白的我的一些理解,,如果有错误的地方,希望大佬们指出。 题目链接: 34. 在排序数组中查找元素的第一个和最后一个位置 本题数组元素不唯一,可能存在多个target,我们就是

    2024年02月08日
    浏览(48)
  • 算法刷题Day1 二分查找+移除元素

    代码随想录-数组-1.数组理论基础 数组是存放在 连续内存空间 上的 相同类型 数据的 集合 优点:常数时间复杂度访问元素 缺点: 在删除或者增添元素的时候,就难免要移动其他元素的地址 ,时间复杂度为O(n) 代码随想录-数组-2.二分查找 前提条件 二分查找前提条件: 数组

    2024年02月10日
    浏览(54)
  • 二分查找实例1(在排序数组中查找元素的第一个和最后一个位置)

    给你一个按照非递减顺序排列的整数数组  nums ,和一个目标值  target 。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值  target ,返回  [-1, -1] 。 你必须设计并实现时间复杂度为  O(log n)  的算法解决此问题。 示例 1: 示例 2: 示例 3: 提示

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包