算法刷题之双指针
杰明学编程
这个作者很懒,什么都没留下…
展开
-
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 · 99 阅读 · 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 · 92 阅读 · 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 · 120 阅读 · 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 · 151 阅读 · 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 评论