167, 88, 142, 76
双指针
双指针法,有时也叫快慢指针,在数组里是用两个整型值代表下标,在链表里是两个指针,一般能实现O(n)的时间解决问题,两个指针的位置一般在第一个元素和第二个元素或者第一个元素和最后一个元素,快指针在前“探路”,当符合某种条件时慢指针向前挪。
双指针还可以用来缩减搜索空间!!!
主要是将一头一尾的索引设为两个指针,当满足条件1时,头指针加一;当满足条件2时,尾指针减一;当满足条件3时,返回结果。多用于有序的数组(矩阵)中,可以有效降低算法的复杂度。
LeetCode26——删除有序数组的重复项
思路:题目有要求必须原地删除,切要求O(1)的额外空间,所以我们需要在原数组上进行处理。此时设有两个快慢两个指针,当快指针遇到的值与上一个值不相同时,即与slow交换值,最后将slow值进行输出即所有不重复的值。
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
n = len(nums)
fast = slow = 1
while fast < n:
if nums[fast] != nums[fast-1]:
nums[slow] = nums[fast]
slow = slow + 1
fast = fast+1
return slow
LeetCode27——移除元素
在fast进行遍历时,将不是nums的值用slow进行统计,最后输出slow,做到删除的效果。所以此时fast为辅助指针,由于遍历原数组。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fast = slow = 0
n = len(nums)
while fast < n:
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
leetcode167-有序数组中找两个数和等于某数
class Solution(object):
def twoSum(self, numbers, target):
low, high = 0, len(numbers)-1
while low < high:
sum = numbers[low] + numbers[high]
if sum == target:
return [low+1, high+1]
if sum > target:
high -= 1
else:
low += 1
return [-1, -1]
leetcode680-判断是不是回文字符串(最多可以删一个字符)
问题分析:两个指针分别指向头和尾,遇见不相等的字符时,跳过一个字符,判断剩下的是不是回文字符串。
class Solution(object):
def validPalindrome(self, s):
def is_palindrome(s, left, right):
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
begin, end = 0, len(s) - 1
print(begin, end)
while begin < end:
if s[begin] != s[end]:
return is_palindrome(s, begin + 1, end) or is_palindrome(s, begin, end - 1)
begin += 1
end -= 1
return True