![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
解题思想-双指针
利用双指针法解题
overlordmax
这个作者很懒,什么都没留下…
展开
-
443. 压缩字符串
1.题目描述给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。进阶:你能否仅使用O(1) 空间解决问题?示例 1:示例 2:示例 3:提示:所有字符都有一个ASCII值在[35, 126]区间内。1 <= len(chars) <= 1000。2.思路(双指针)使用两个指针 read 和 write 分别标记读和写的位置。读写操作均从原创 2021-02-25 22:18:04 · 110 阅读 · 0 评论 -
977. 有序数组的平方
1.题目描述给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按非递减顺序排序。示例 1:示例 2:提示:1 <= nums.length <= 104-104 <= nums[i] <= 104nums 已按非递减顺序排序2.思路(双指针)利用「数组 nums 已经按照升序排序」这个条件。显然,如果数组 nums 中的所有数都是非负数,那么将每个数平方后,数组仍然保持升序;如果数组 nums 中的所有数都是负数,那么将原创 2021-02-24 23:59:22 · 159 阅读 · 0 评论 -
334. 递增的三元子序列
1.题目描述给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。示例 1:示例 2:示例 3:提示:1 <= nums.length <= 105-2^31 <= nums[i] <= 2^31 - 12.方法一求最长上升子序列,原创 2021-02-09 11:46:05 · 373 阅读 · 0 评论 -
209. 长度最小的子数组
1.题目描述给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:进阶:如果你已经完成了 O(n) 时间复杂度的解法, 请尝试 O(nlogn) 时间复杂度的解法。2.思路定义两个指针 start 和 end 分别表示子数组的开始位置和结束位置,维护变量 sum 存储子数组中的元素和(即从nums[start] 到 nums[end] 的元素和)。初始状态下,start 和 end原创 2021-02-07 12:02:39 · 122 阅读 · 0 评论 -
92. 反转链表 II
1.题目描述反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL2.思路(双指针)1.设置两个指针cur和pre2.cur和pre移动到位置m,也就是翻转链表的起始位置3.指针tail为翻转后的尾节点,con指针为第m个节点的前一个节点,此结点是翻转后链表的头部原创 2021-01-31 20:17:14 · 81 阅读 · 0 评论 -
165. 比较版本号
1.题目描述给你两个版本号 version1 和 version2 ,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个 ‘.’ 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和修原创 2021-01-30 23:00:23 · 141 阅读 · 0 评论 -
415. 字符串相加
1.题目描述给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。提示:num1 和num2 的长度都小于 5100num1 和num2 都只包含数字 0-9num1 和num2 都不包含任何前导零你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式2.思路1.设定 i,j 两指针分别指向 num1,num2 尾部,模拟人工加法;2. 计算 sum = n1 + n2 + carry,并将当前位 sum % 10 添加至 res 头部;3.原创 2021-01-26 10:47:57 · 49 阅读 · 0 评论 -
349. 两个数组的交集
1.题目描述给定两个数组,编写一个函数来计算它们的交集。示例 1:示例 2:说明:1.输出结果中的每个元素一定是唯一的。2.我们可以不考虑输出结果的顺序。2.方法1分别遍历两个数组并用set保存每个数组的元素,元素较少的set记为s1,元素较多的set记为s2,遍历s1并查找当前遍历的元素是否存在于s2中,如果存在就加入结果数组。3.代码class Solution {public: vector<int> intersection(vector<int&原创 2021-01-12 16:05:58 · 67 阅读 · 0 评论 -
有序数组中不重复元素的个数
1.题目描述给定一个有序数组,请算出平方后的数组有多少个不相同的数字。例子,[-1,3,3],返回结果 2.例子,[-1,-1,1,1],返回结果 1.2.思路使用双指针,对left和right的绝对值进行比较,如果不相等,那么绝对值大的一边进行收缩,并且不相等的数加一,但是要记录一下这个数的绝对值,这样碰到相同的可以越过去。比如[-1,3,3],一开始right绝对值为3,left绝对值为1,不相等,res为1,记录pre为3,右边向里面收缩一位,然后right绝对值还是3,left绝对值为1,原创 2020-10-07 17:29:48 · 1168 阅读 · 2 评论 -
202. 快乐数
1.题目描述编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。示例:2.思路使用 “快慢指针” 思想,找出循环:“快指针” 每次走两步,“慢指针” 每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为 1 引起的循环,是的话就是原创 2020-09-27 23:41:10 · 58 阅读 · 0 评论 -
32. 最长有效括号
1.题目描述给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:示例 2:2.思路利用两个计数器 eft 和 right 。首先,从左到右遍历字符串,对于遇到的每个 ‘(’,left++,对于遇到的每个 ‘)’ ,right++。每当 left 计数器与 right 计数器相等时,计算当前有效字符串的长度,并且记录目前为止找到的最长子字符串。当 right 计数器比 left 计数器大时,我们将 left 和 right 计数器同时变回 0。这样的做法原创 2020-09-09 19:05:59 · 83 阅读 · 0 评论 -
125. 验证回文串
1.题目描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:示例 2:2.思路直接在原字符串 s 上使用双指针。在移动任意一个指针时,需要不断地向另一指针的方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向的字符是否相同。3.代码class Solution {public: bool isPalindrom原创 2020-09-08 22:58:42 · 112 阅读 · 0 评论 -
76. 最小覆盖子串
1.题目描述给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。示例:提示:1.如果 S 中不存这样的子串,则返回空字符串 “”。2.如果 S 中存在这样的子串,我们保证它是唯一的答案。2.思路(滑动窗口)用left,right表示滑动窗口的左边界和右边界,通过改变left,right来扩展和收缩滑动窗口,可以想象成一个窗口在字符串上游走,当这个窗口包含的元素满足条件,即包含字符串T的所有元素,记录下原创 2020-09-01 13:40:15 · 111 阅读 · 0 评论 -
42. 接雨水
1.题目描述给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例:2.思路(双指针)只要right_max[i]>left_max[i] ,积水高度将由 left_max 决定,类似地 left_max[i]>right_max[i],积水高度有right_max决定。3.代码class Solution {public: int trap(vector<int>& height) {原创 2020-08-27 23:59:05 · 65 阅读 · 0 评论 -
26. 删除排序数组中的重复项
26. 删除排序数组中的重复项1.题目描述给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:示例 2:2.思路设置快慢指针j,i,当nums[i] == nums[j]时,j往后移,直到nums[i] !=nums[j],此...原创 2020-04-01 23:06:17 · 70 阅读 · 0 评论 -
16. 最接近的三数之和
16. 最接近的三数之和1.题目描述给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。2.思路排序和双指针1.首先进行数组排序,时间复杂度 O(nlogn)2.使用前指针指向 start = i + 1 处,后指针指向 end = nums.leng...原创 2020-03-30 18:00:19 · 133 阅读 · 0 评论 -
11. 盛最多水的容器
11. 盛最多水的容器1.题目描述给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。示例:2.思路(双指针) 使用两个指针,一个放在开始,一...原创 2020-03-06 10:36:04 · 132 阅读 · 0 评论 -
524. 通过删除字母匹配到字典里最长单词
524. 通过删除字母匹配到字典里最长单词1.题目描述给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。示例 1:示例 2:说明:所有输入的字符串只包含小写字母。字典的大小不会超过 1000。所有输入的字符串长度不会超过 1000。2....原创 2020-02-14 14:41:43 · 83 阅读 · 0 评论 -
141. 环形链表
141. 环形链表1.题目描述给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例 1:示例 2:示例 3:2.思路使用双指针,一个指针每次移动一个节点,一个指针每次移动两个节点,如果存在环,那么这两个指针一定会相遇。3.代码/** * Def...原创 2020-02-14 14:13:06 · 81 阅读 · 0 评论 -
88. 合并两个有序数组
88. 合并两个有序数组给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:1.初始化 nums1 和 nums2 的元素数量分别为 m 和 n。2.你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:2.思路需要从尾开始遍历,否则在 nums1 上归...原创 2020-02-14 12:58:35 · 74 阅读 · 0 评论 -
680. 验证回文字符串 Ⅱ
680. 验证回文字符串 Ⅱ1.题目描述给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:示例 2:注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。2.思路 所谓的回文字符串,是指具有左右对称特点的字符串,例如 “abcba” 就是一个回文字符串。 使用双指针可以很容易判断一个字符串是否是回文字符串:令一个指针从左到右遍...原创 2020-02-14 12:41:02 · 136 阅读 · 0 评论 -
345. 反转字符串中的元音字母
345. 反转字符串中的元音字母1.题目描述编写一个函数,以字符串作为输入,反转该字符串中的元音字母。示例 1:示例 2:说明:元音字母不包含字母"y"。2.思路 使用双指针,一个指针从头向尾遍历,一个指针从尾到头遍历,当两个指针都遍历到元音字符时,交换这两个元音字符。 为了快速判断一个字符是不是元音字符,将全部元音字符添加到元音字符串str 中,从而以 O(1) 的时间...原创 2020-02-14 12:24:05 · 74 阅读 · 0 评论 -
633. 平方数之和
633. 平方数之和1.题目描述给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。示例1:示例2:2.思路 可以看成是在元素为 0~target 的有序数组中查找两个数,使得这两个数的平方和为 target,如果能找到,则返回 true,表示 target 是两个整数的平方和。 本题和 167. Two Sum II - Input ...原创 2020-02-14 12:01:56 · 149 阅读 · 0 评论 -
167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组1.题目描述给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:1.返回的下标值(index1 和 index2)不是从零开始的。2.你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:2...原创 2020-02-14 11:10:27 · 64 阅读 · 0 评论