双指针
双指针类题目
YXXYX
精通CV编程
展开
-
15. 三数之和(双指针)
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]提示:0 <= nums.length <= 3000-105 <原创 2021-08-19 12:23:31 · 216 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点(C语言)
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.这道题只需要定义一个快指针来先跑k个节点,然后头指针开始和快指针一起跑,直到快指针跑到链表结束(NULL),则头指针刚好跑到倒数第k个位原创 2021-04-08 23:48:17 · 283 阅读 · 0 评论 -
剑指 Offer 24. 反转链表(C语言)
**定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000**这道题可以通过两个一前一后的指针来实现;先定义一个指针p和head一样指向第一个节点,然后再定义一个指向NULL的指针q位于p的后面,也就是head的前面,让p指向的节点的指针域反过来指向q,p不断向前移动直到原创 2021-04-09 16:30:19 · 282 阅读 · 2 评论 -
876. 链表的中间结点(C语言)
**给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next =原创 2021-04-09 17:56:28 · 737 阅读 · 0 评论 -
环形链表。
给定一个链表,判断链表中是否有环。如果链表中存在环,则返回 true 。 否则,返回 false 。思路:定义快慢指针,快指针一次走两个节点,慢指针一次走一个节点,若链表中有环形链表,则快指针一定会与慢指针相遇。注意:该题的快慢指针开始并没有在一个起点,是为了满足while的条件。/* * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; *原创 2021-05-15 16:49:05 · 126 阅读 · 0 评论 -
回文链表。
请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true方法一:1.找到中间节点(快慢指针,快走二,慢走一,最后慢为中间节点位置)2.中间节点之后的链表反转(前一个节点指针域指向后一个节点)3.前半部分链表和后半部分反转的链表比较4.后半部分反转的链表回归原样(因为通过函数对链表操作最好不要修改原链表结构)//判断一个链表是否为回文链表/* * Definition for sing原创 2021-05-15 19:07:30 · 111 阅读 · 0 评论 -
移动零&&移除元素
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。这道题我开始想到了某种交换应该可以解决,但是没有写出代码;看了官方的题解后真的是太妙了,大致思路是:两个指针fast和slow开始位于数组首端,如果fast不为0则与slow交换数值,若为零则继续向前走;在这里fast将会遍历完数组中的所有元素,但是slow除了首元素原创 2021-05-18 16:22:59 · 130 阅读 · 0 评论 -
两数之和 II - 输入有序数组
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例 1:输入:numbers = [2,7,11,15], target =原创 2021-05-18 18:00:45 · 186 阅读 · 0 评论 -
合并排序的数组
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。初始化 A 和 B 的元素数量分别为 m 和 n。示例:输入:A = [1,2,3,0,0,0], m = 3B = [2,5,6], n = 3输出: [1,2,2,3,5,6]说明: A.length == n + m这道题最简单的思路是直接将数组B与A合并然后再排序,但是过于麻烦切时间复杂度为O(nlogn);而用指针则可以用O(n)的时间复杂度解决原创 2021-05-18 19:28:06 · 147 阅读 · 0 评论 -
删除有序数组中的重复项(数组去重)
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明: 为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下:// nums是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicates(num原创 2021-05-19 11:33:38 · 559 阅读 · 0 评论