美文网首页
算法笔记之双指针(数组)

算法笔记之双指针(数组)

作者: 简单一点点 | 来源:发表于2020-07-08 00:40 被阅读0次

双指针

双指针法一般用来解决数组和链表等线性数据结构中的一些问题,在数组中一般使用2个下标,在链表中一般是2个指针。双指针中两个指针的位置和移动顺序有多种组合,比如2个指针分别在头部和尾部,分别向中间移动,又或者2个指针在第一和第二个元素逐渐向后移动。本部分先看一下数组中双指针的用法。

Leetcode15. 三数之和

问题概述:从一个数组中找到3个元素相加和为0.

解题思路:首先对数组排序,然后从左到右遍历第一个元素,固定第一个元素后,剩余两个元素分别从下一个位置和最后一个位置向中间移动,直到找到和为0或者相遇。

Python代码:

def threeSum(nums):
    # 排序
    nums = sorted(nums)
    i = 0
    j = 0
    k = 0
    result = []
    # 遍历
    while k < (len(nums) - 2):
        if nums[k] > 0:
            break
        i = k + 1
        j = len(nums) - 1
        while i < j:
            left = nums[i]
            right = nums[j]
            if nums[i] + nums[j] + nums[k] == 0:
                result.append([nums[k], nums[i], nums[j]])
                while j > i and nums[j] == right:
                    j -= 1
                while j > i and nums[i] == left:
                    i += 1
            elif nums[i] + nums[j] + nums[k] > 0:
                while j > i and nums[j] == right:
                    j -= 1
            else:
                while j > i and nums[i] == left:
                    i += 1
        current = nums[k]
        while k < (len(nums) - 2) and nums[k] == current:
            k += 1
    return result

LeetCode16. 最接近的三数之和

LeetCode18. 四数之和都和本题类似。

LeetCode11. 盛最多水的容器

题目概述:给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

解题思路:使用双指针,初始时双指针指向开头和结尾,由于容纳的水量是由
两个指针指向的数字中较小值∗指针之间的距离决定的。由于向中间移动指针距离会变小,所以要想容水量最大必须要点的值变大,因此我们移动较小的值直到找到一个比它大的值求出新的容量。一直移动到两个指针相遇求出最大的容量。

Python代码:

def maxArea(height):
    start = 0
    end = len(height) - 1
    result = []
    while start < end:
        if height[start] < height[end]:
            result.append(height[start] * (end - start))
            start += 1
        else:
            result.append(height[end] * (end - start) )
            end -= 1
        
    return max(result)

下篇文档写一下链表中的双指针。

相关文章

  • 算法笔记之双指针(数组)

    双指针 双指针法一般用来解决数组和链表等线性数据结构中的一些问题,在数组中一般使用2个下标,在链表中一般是2个指针...

  • 【剑指offer-双指针】

    导读 算法 | 双指针套路总结 常用的双指针技巧 算法与数据结构基础 - 双指针 目录: 面试题04. 二维数组中...

  • LeetCode进阶977-双指针

    概要 双指针是一种比较常见的算法思想,在循环遍历数组时经常会用到。双指针主要有两种算法技巧:1、快慢指针(例如已发...

  • 移除数组中的元素

    移除数组中的元素,双指针算法,利用元数组元素覆盖的方式,利用指针移动到指定的元素,即可一次便利实现

  • 剑指 Offer II 006. 排序数组中两个数字之和

    双指针 左右指针 因为数组是升序数组

  • 再学C语言之指针要点

    C之字符数组 C之指针引用字符串 C语言之数组指针 数组指针:首先它是一个指针,它指向数组指针数组:首先它是一个数...

  • 算法草稿

    常用算法集合 字符处理算法数组与查找链表树算法思路 递归、动态规划、BFS/DFS、双指针、二分法搜索数据结构的...

  • Algorithm小白入门 -- 数组

    数组双指针技巧数组删除、去重 1. 双指针技巧 1.1 快慢指针 快慢指针一般都初始化指向链表的头结点head,前...

  • 滑动窗口算法

    一、滑动窗口算法 也会使用两个指针,但和双指针算法不同的是双指针算法关注的往往是两个指针正在指向的两个元素,而滑动...

  • 算法通关手册:07 数组双指针

    本文首发于:「算法通关手册」[https://algo.itcharge.cn]文中代码地址(欢迎 「Star ★...

网友评论

      本文标题:算法笔记之双指针(数组)

      本文链接:https://www.haomeiwen.com/subject/numxcktx.html