算法刷题之双指针
杰明学编程
这个作者很懒,什么都没留下…
展开
-
3. 无重复字符的最长子串
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 题解思路: 方法一:滑动窗口 函数代码: class Solution { public: int lengthOfLongestSubstring(string s) { int n=s.size(); int freq[256]={0}; int l=0,r=-1; int res=0; while(l<n) {原创 2020-09-02 00:33:15 · 98 阅读 · 0 评论 -
287. 寻找重复数
题目: 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。 题解思路: 方法一:双指针+快慢指针 函数代码: class Solution { public: int findDuplicate(vector<int>& nums) { int slow=0; int fast=0; slow=nums[slow原创 2020-09-07 11:41:24 · 91 阅读 · 0 评论 -
86. 分隔链表
题目: 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 题解思路: 方法:双指针就行分割 遍历链表,把小于x的链表L1进行串起来,大于x的链表L2串起来,最后L1的下一个结点就是L2的头结点。 函数代码: class Solution { public: ListNode* partition(ListNode* head, int x) { ListNode *dummy1=ne原创 2020-09-05 15:38:28 · 125 阅读 · 0 评论 -
143. 重排链表
题目: 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 方法:双指针+快慢指针+翻转链表 1.快慢指针找到切分链表 2.翻转右半部分链表 3左右合并拼接,依次合并 函数代码: class Solution { public: void reorderList(ListNode* head) { if(!head||!head->next原创 2020-09-05 15:38:07 · 119 阅读 · 0 评论 -
445. 两数相加 II
题目: 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。 题解思路: 方法:栈 函数代码一: class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { stack&原创 2020-09-05 15:37:32 · 70 阅读 · 0 评论 -
234. 回文链表
题目: 请判断一个链表是否为回文链表。 题解思路: 方法一:暴力法 遍历链表,将链表里元素的值放入数组里面,然后再判断数组里面的数字是不是回文数字。 函数代码一: class Solution { public: bool isPalindrome(ListNode* head) { if(!head) { return true;; } ListNode *p=head; int len=0;原创 2020-09-05 15:37:10 · 82 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
方法一:暴力法+求长度法(不推荐) 函数代码: class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *p=headA; int len1=0; ListNode *q=headB; int len2=0; int dis=0; while(p)原创 2020-09-04 14:08:22 · 150 阅读 · 0 评论 -
142. 环形链表 II(找出链表环的起始点)
题目: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 题解思路: 方法:双指针 函数代码: class Solution { public: ListNode *detectCycle(ListNode *head) { if(!head||!head->next)原创 2020-09-04 11:41:46 · 145 阅读 · 0 评论 -
141. 环形链表
题目: 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 题解思路: 方法一:双指针+快慢指针+判断是否相遇 函数代码: class Solution { public: bool hasCycle(ListNode *head) { if(!head||!head->next) { return fals原创 2020-09-04 11:27:38 · 81 阅读 · 0 评论 -
92. 反转链表 II(翻转部分链表)
题目: 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 方法:双指针+穿针引线 函数代码: class Solution { public: ListNode* reverseBetween(ListNode* head, int m, int n) { if(!head) { return head; } ListNode *dummy=new ListN原创 2020-09-04 10:39:46 · 124 阅读 · 0 评论 -
24. 两两交换链表中的节点
题目: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 题解思路: 方法:穿针引线+四个指针 函数代码: class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode *dummy=new ListNode(0); dummy->next=head; ListNode *p=dummy;原创 2020-09-04 01:08:31 · 120 阅读 · 0 评论 -
19. 删除链表的倒数第N个节点
题目: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 题解: 方法一:一次遍历+双指针 函数代码: class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { if(!head) { return head; } ListNode *p=new ListNode(0); p-&g原创 2020-09-04 00:35:47 · 85 阅读 · 0 评论