Leetcode刷题——数组双指针

Leetcode刷题——数组双指针

    • 内容概要
    • 刷题

内容概要

双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问,从而达到相应的目的。如果两个指针方向相反,则称为「对撞时针」。如果两个指针方向相同,则称为「快慢指针」。如果两个指针分别属于不同的数组 / 链表,则称为「分离双指针」。

滑动窗口(Sliding Window):在给定数组 / 字符串上维护一个固定长度或不定长度的窗口。可以对窗口进行滑动操作、缩放操作,以及维护最优解操作。滑动操作——窗口可按照一定方向进行移动。最常见的是向右侧移动。缩放操作——对于不定长度的窗口,可以从左侧缩小窗口长度,也可以从右侧增大窗口长度。
滑动窗口利用了双指针中的快慢指针技巧,我们可以将滑动窗口看做是快慢指针两个指针中间的区间,也可以可以将滑动窗口看做是快慢指针的一种特殊形式。

刷题

    1. 移动零
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        left = 0
        right = 0
        while right < len(nums):
            if nums[right] != 0:
                nums[left],nums[right] = nums[right],nums[left]
                left += 1
            right  += 1
    1. 颜⾊分类
      对数组 nums 里面的每一个值 nums[i] 进行遍历,如果 nums[i] == 0 就放到前面,如果 nums[i] == 2 就放到后面,顺序就排好了。具体的操作中可以用两个指针 p0 和 p2 分别来标识 0 的下一位和2的上一位,p0 从0开始往后,p2 从 n-1 开始往前。
class Solution:
    def sortColors(self, nums: List[int]) -> None:
        left = 0
        right = len(nums)-1
        i = 0
        
        while i <= right:
        #nums[i] 和 nums[p2] 交换,nums[p2] 还没有被check过,交换后,nums[p2] 被交换到 nums[i] 的位置后,如果 i 移动到 i+1, 那么 nums[p2] 就被漏掉了。所以,要继续比较 nums[i] 是否等于 0 或 2。
            while nums[i] == 2 and i <= right:
                nums[i],nums[right] = nums[right],nums[i]
                right -= 1
            if nums[i] == 0:
                nums[i],nums[left] = nums[left],nums[i]
                left += 1
            i += 

你可能感兴趣的:(leetcode,算法,矩阵)