Skip to content

双指针题目

移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

暴力解法要注意python里面for循环range是固定的,不能像c一样通过控制for循环里面的size控制循环次数,只能用while循环

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        cishu = 0
        i = 0
        size = len(nums)
        while (i<size):
            if nums[i]==val:
                for j in range(i+1,size):
                    nums[j-1] = nums[j]
                size -= 1
                cishu += 1

            else:
                i += 1
        return size

双指针解法,通过快慢指针来实现,快指针遍历整个数组,慢指针记录新数组的位置

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

        return left

有序数组的平方

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

关键在于大的一定在两边,通过双指针进行遍历,然后将大的值放到新数组的末端

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        size = len(nums)-1
        right = size
        left = 0
        result = [0] * len(nums)  # 初始化 result 列表,长度与 nums 一样
        while(left<=right):
            if (nums[left]*nums[left]>nums[right]*nums[right]):
                result[size]=nums[left]*nums[left]
                left += 1
                size -= 1
            else:
                result[size] = nums[right]*nums[right]
                right -= 1
                size -= 1

        return result