滑动窗口的应用广泛,常用于减少线性逻辑的时间复杂度问题上。
滑动窗口思想:在线性逻辑中,允许用单位长度方向性的移动,通过计算窗口的值,求解最终值
滑动窗口特点:
- 依附于动态规划(大解分为多个小解)
- 线性移动
滑动窗口思路:
- 确定窗口大小
- 窗口进出策略
- 窗口内部逻辑
滑动窗口在定义上更好理解,但是在应用中却更麻烦,窗口移动、进进出出涉及的细节比较多,容易遗漏,下面通过一个直观的例子感受下, leetcode19.删除链表的倒数第N个节点
题目描述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
这道题的解决方法可以有多个,这里只说一种双指针法,双指针构成一个滑动窗口,窗口的大小是n,随着窗口移动,第一个指针到达链表末尾时,第二个指针也就到了倒数第n个位置
public class Solution {
public ListNode remove(ListNode head, int n) {
//待返回链表
ListNode dummy = new ListNode(0);
dummy.next = head;
//双指针
ListNode f