数组双指针

双指针

双指针是一种思想或一种技巧并不是特别具体的算法。
就是用两个变量动态存储两个结点,来方便我们进行一些操作,通常用在线性的数据结构中,这部分题目主要是针对列表中的双指针解法,在链表中的用法会在后面更新。

常见的双指针包括同速双指针和快慢双指针。
顾名思义,同速双指针就是两个指针的移动速度相同。快慢双指针就是两个指针变量的移动速度不同,一般情况是根据快指针的状态来更新慢指针的状态。

27. 移除元素

给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

from typing import List


class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        first, second = 0, 0
        while second < len(nums):
            if nums[second] != val:
                nums[first] = nums[second]
                first += 1
            second += 1
        return first

26. 删除有序数组中的重复项

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么nums的前 k 个元素应该保存最终结果。
将最终结果插入nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

from typing import List


class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return 1
        first, second = 0, 0
        while second < len(nums):
            if nums[first] != nums[second]:
                first += 1
                nums[first] = nums[second]
            second += 1

        return first + 1

283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。

from typing import List


class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        left, right = 0, 0
        while right < len(nums):
            if nums[right] != 0:
                nums[right], nums[left] = nums[left], nums[right]
                left += 1
            right += 1

844. 比较含退格的字符串

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。

class Solution:
    def backspaceCompare(self, s: str, t: str) -> bool:
        first = len(s) - 1
        second = len(t) - 1
        fs ,ss = 0, 0
        while first >= 0 or second >= 0:
            while first >= 0:
                if s[first] == "#":
                    first -= 1
                    fs += 1
                elif fs > 0:
                    fs -= 1
                    first -= 1
                else:
                    break
            while second >= 0:
                if t[second] == "#":
                    second -= 1
                    ss += 1
                elif ss > 0:
                    ss -= 1
                    second -= 1
                else:
                    break
            
            if first >= 0 and second >= 0:
                if s[first] != t[second]:
                    return False
            elif first >= 0 or second >= 0:
                return False
            
            first -= 1
            second -= 1
        return True

977. 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

from typing import List


class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        ans = [0] * len(nums)
        first, last = 0, len(nums) - 1
        index = len(nums) - 1
        while index >= 0:
            if abs(nums[first]) >= abs(nums[last]):
                ans[index] = nums[first] * nums[first]
                first += 1
            else:
                ans[index] = nums[last] * nums[last]
                last -= 1
            index -= 1
        return ans
posted @ 2022-08-13 09:40  智慧小熊猫  阅读(42)  评论(0编辑  收藏  举报