数组技巧分为快慢指针和左右指针两种技巧
快慢指针技巧
一、遇到原地处理数组,保持其他元素相对位置不变,典型的快慢指针数组问题
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
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
四、回文串判断
回文串就是正着读和反着读都一样的字符串。
比如说字符串
aba
和abba
都是回文串,因为它们对称,反过来还是和本身一样;反之,字符串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]