数组技巧分为快慢指针和左右指针两种技巧

数组技巧分为快慢指针和左右指针两种技巧

快慢指针技巧

一、遇到原地处理数组,保持其他元素相对位置不变,典型的快慢指针数组问题

leetcode283 移动零

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        p = self.removeElement(nums, 0) #这个只保证了前面slow个数字没有非零元素,后面的0还需要写进去
        for i in range(p, len(nums)):
            nums[i] = 0
    def removeElement(self, nums, val) -> int :
        fast, slow = 0, 0 
        while fast < len(nums):
            if nums[fast]  != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1 
        return slow

二、数组中另一大类快慢指针就是滑动窗口算法

left 指针在后,right 指针在前,两个指针中间的部分就是「窗口」,算法通过扩大和缩小「窗口」来解决某些问题。

左右指针技巧

一、二分查找

二分查找要求数组是有序的

二、两数之和

只要数组有序(不需要严格递增),就应该想到双指针技巧。 有些类似二分查找技巧,调节left 和 right找到sum

167. 两数之和 II - 输入有序数组

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        left, right = 0, len(numbers) - 1
        while left < right: #遇到while循环考虑终止条件,这里是left = right 的时候终止,left不可以等于right,所以符合条件     
            s = numbers[left] + numbers[right]
            if s == target:
                return [left + 1, right + 1]
            elif s > target:
                right -= 1
            elif s < target:
                left += 1
        #题意是每个输入一定有唯一的正确答案

三、反转字符串

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        left, right = 0, len(s) - 1
        while left < right:
            c = s[left]
            s[left] = s[right]
            s[right] = c 
            left += 1
            right -= 1

四、回文串判断

回文串就是正着读和反着读都一样的字符串。

比如说字符串 abaabba 都是回文串,因为它们对称,反过来还是和本身一样;反之,字符串 abac 就不是回文串。所以很容易想到和回文串相关的题目需要用到左右指针

回文子串问题则是让左右指针从中心向两端扩展。不过这种情况也就回文串这类问题会遇到。

三元运算符(也称为条件表达式)在Python中用于在一行中完成条件判断和赋值操作

<expression1> if <condition> else <expression2>

x = 10
y = 20
max_value = x if x > y else y
print(max_value)  # 输出: 20

回文串问题,长度为偶数,中心为i, i + 1 来找,长度为奇数,中心为i 来找

leetcode5 最长回文子串

class Solution:
    def longestPalindrome(self, s: str) -> str:
        res = ""
        for i in range(len(s)):
            s1 = self.palindrome(s, i, i)#找到以i为中心,长度为奇数的最长回文串
            s2 = self.palindrome(s,i, i + 1) #找到以i,i + 1为中心,长度为偶数的最长回文串
            res = max([res, s1, s2], key = len)#max函数,以len最为关键字参数,比较字符串的长度

        return res

    def palindrome(self, s: str, l: int, r: int) -> str: #双指针,从中心开始拓展
        while l >= 0 and r < len(s) and s[l] == s[r]:#不满足条件之前l,r 会左右走一步,所以注意返回的区间
            l -= 1
            r += 1
        return s[l + 1: r] 
  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值