算法思想中的两点法和滑动窗口法及python实例
1. 两点法(Two Pointers):
两点法一般用于解决数组或链表中的问题,通过定义两个指针来扫描数组或链表,从而到满足特定条件的解。
常见的两点法包括快慢指针、左右指针和对撞指针等。
快慢指针:通过定义两个指针,一个指针每次移动一步,另一个指针每次移动两步,从而解决一些与链表中的环相关的问题。
示例:判断链表是否有环
```python
def hasCycle(head):
if not head or :
return False
slow = head
fast =
while slow != fast:
if not fast or :
return False
slow =
fast =
return True
```
左右指针:通过定义两个指针,一个指针从数组或字符串的起始位置向右移动,另一个指针从数组或字符串的末尾位置向左移动,从而解决一些与数组或字符串中的对称性相关的问题。
示例:判断一个字符串是否是回文串
```python
def isPalindrome(s):
left = 0
right = len(s) - 1
数组和链表
while left < right:
while left < right and not s[left].isalnum(:
left += 1
while left < right and not s[right].isalnum(:
right -= 1
if s[left].lower( != s[right].lower(:
return False
left += 1
right -= 1
return True
```
对撞指针:通过定义两个指针,一个指针从数组的起始位置向右移动,另一个指针从数组的末尾位置向左移动,从而解决一些与数组中的查问题。
示例:在一个已排序的数组中到两个数使它们的和等于目标值
```python
def twoSum(nums, target):
left = 0
right = len(nums) - 1
while left < right:
if nums[left] + nums[right] == target:
return [left, right]
elif nums[left] + nums[right] < target:
left += 1
else:
right -= 1
return []
```
2. 滑动窗口法(Sliding Window):
滑动窗口法是指通过定义一个窗口,然后通过不断移动窗口的起始和终止位置,来解决一些需要在连续子串或子数组中到满足特定条件的解的问题。
示例:到字符串中最长的不含重复字符的子串
```python
def lengthOfLongestSubstring(s):
if not s:
return 0
left = 0
right = 0
max_len = 0
window = set
while right < len(s):
if s[right] not in window:
window.add(s[right])
max_len = max(max_len, right - left + 1)
right += 1
else:
ve(s[left])
left += 1
return max_len
```
滑动窗口法的时间复杂度通常为O(n),因为在每个位置上,起始指针和终止指针分别只移动了一次。
这是关于算法思想中的"两点法"和"滑动窗口法"的详细说明,包括了它们的定义和应用场景,并给出了相应的Python实例。这两种思想在解决一些数组或字符串相关问题时非常有用,并且时间复杂度较低,因此在面试中经常会被使用到。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。