数据结构与算法
文章平均质量分 83
用于记录个人数据结构与算法的学习过程和刷题心得分享。
好好学习、天天向上。
这个作者很懒,什么都没留下…
展开
-
算法刷题——删除排序链表中的重复元素(力扣)
但是有一个关键点,如果链表末尾存在重复元素,则不能通过快指针跳过,否则链表末尾重复的元素无法去掉,这种情况需要单独考虑。:给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次。返回 已排序的链表。对于链表的跳过某些元素,通过一个节点便可以实现,改变节点的指针,并不需要双指针法。由于链表本身是已排序的,所以相等的元素一定相邻,所以考虑使用。输入:head = [1,1,2,3,3]输入:head = [1,1,2]O(n),其中n是链表的长度。输出:[1,2,3]原创 2024-01-14 17:07:07 · 386 阅读 · 1 评论 -
算法刷题——寻找数组的中心下标(力扣)
记数组的全部元素之和为total,当遍历到第i个元素时,设其左侧元素之和为 sum,则其右侧元素之和为 total−numi−sum。左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0。,其中sum为前缀和(左侧和),numi第i个元素的值,total为全部元素之和。数组中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。原创 2024-01-14 23:25:39 · 862 阅读 · 1 评论 -
算法刷题——构造限制重复的字符串(力扣)
(堆)priority_queue<pair<char,int>> hp,其中pair<char,int>中char为字符串中出现过的字符,int为字符串出现的次数,一个堆的堆顶为最大的字符,另一个堆的堆顶为次大的字符,从而实现最大的repeatLimitedString的输出,但是思绪太乱,没有理清楚解决问题的先后顺序,因此最后并没有解答出本题。如果在字符串 a 和 b 不同的第一个位置,字符串 a 中的字母在字母表中出现时间比字符串 b 对应的字母晚,则认为字符串 a 比字符串 b 字典序更大。原创 2024-01-13 22:59:30 · 1023 阅读 · 1 评论 -
算法刷题——滑动窗口的最大值(力扣)
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。在 C++ 中,emplace 函数通常用于容器类,例如 std::vector、std::map、std::set 等。主要的优势是,emplace 直接在容器内部进行对象的构造,避免了临时对象的拷贝或移动操作,提高了效率。O((n-k+1)*k) = O(nk),(n-k+1)为滑动窗口移动的次数。输入:nums = [1,3,-1,-3,5,3,6,7], k = 3。输出:[3,3,5,5,6,7]原创 2024-01-12 20:17:47 · 1293 阅读 · 0 评论 -
算法刷题——统计出现过一次的公共字符串(力扣)
输入:words1 = [“leetcode”,“is”,“amazing”,“as”,“is”], words2 = [“amazing”,“leetcode”,“is”]:给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。输入:words1 = [“b”,“bb”,“bbb”], words2 = [“a”,“aa”,“aaa”]输入:words1 = [“a”,“ab”], words2 = [“a”,“a”,“a”,“ab”]原创 2024-01-12 17:12:08 · 903 阅读 · 0 评论 -
算法刷题——构造有效字符串的最少插入数(力扣)
ab,bc,ac前面的a,b,a都会导致+2的贡献,就是要加bc,ac,bc才能成为有效字符串,而后面的b,c,c都会减少一个贡献,就是bc,ac,bc减少了b,c,c。:给你一个字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字母数。即aa,ba,bb,ca,cb,cc等会产生+2,而ab,bc,ac等则会导致-1。解释:在 “b” 之前插入 “a” ,在 “b” 之后插入 “c” 可以得到有效字符串 “abc”。原创 2024-01-11 23:01:20 · 418 阅读 · 0 评论 -
算法刷题——链表的中间结点(力扣)
更加简洁高效地实现了链表中间结点的返回。主要要抓住快指针每次走两步与慢指针每次走一步之间存在的数学关系,这样快指针走到链表尾巴时,慢指针就刚好走到链表中间点。解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。:给你单链表的头结点 head ,请你找出并返回链表的中间结点。输入:head = [1,2,3,4,5,6]如果有两个中间结点,则返回第二个中间结点。输入:head = [1,2,3,4,5]解释:链表只有一个中间结点,值为 3。输出:[3,4,5]输出:[4,5,6]原创 2024-01-10 19:52:51 · 351 阅读 · 0 评论 -
算法刷题——字符串中的第一个唯一字符(力扣)
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引。做题时,想着在遍历字符串时,不仅需要使用哈希表将重复的字符标记,还需要将不重复的字符的。O(∣Σ∣),其中 Σ 是字符集,在本题中 s 只包含小写字母,因此 ∣Σ∣≤26。哈希表,O(m),其中m为字符串中不同字符的数量,<=26。记录下来,方便后面通过哈希表得到第一个不重复的字符的索引;输入: s = “loveleetcode”O(n),其中 n 是字符串 s 的长度。输入: s = “leetcode”循环字符串,O(n)。原创 2024-01-09 20:35:03 · 947 阅读 · 0 评论 -
算法刷题——判断子序列(力扣)
做题时没有想到通过使用双指针来完成两个字符串的匹配,当时是通过暴力法(两个循环)来实现匹配。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。双指针法,O(n+m),其中 n 为 s 的长度,m 为 t 的长度。每次无论是匹配成功还是失败,都有至少一个指针发生右移,两指针能够位移的总距离为 n+m。:给定字符串 s 和 t ,判断 s 是否为 t 的子序列。输入:s = “abc”, t = “ahbgdc”暴力解法,O(nm),n、m分别为s和t的长度。时,可以优先考虑使用。原创 2024-01-10 17:40:47 · 582 阅读 · 0 评论 -
算法刷题——数据流的中位数(力扣)
输入 [“MedianFinder”, “addNum”, “addNum”, “findMedian”, “addNum”,“findMedian”] [[], [1], [2], [], [3], []]// 返回 1.5 ((1 + 2) / 2)如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。查询中位数:O(nlogn),由于需要先对容器里的元素进行排序再进行中位数的查询。需要两个额外的容器来完成中位数的查询,O(n)O(n),主要为有序集合的开销。查找中位数:O(1)原创 2024-01-09 15:54:40 · 894 阅读 · 0 评论 -
【算法刷题——回旋镖数量(力扣)】
给定平面上 n 对 互不相同 的点 points ,其中 points[i] = [xi, yi]。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]输入:points = [[0,0],[1,0],[2,0]]输入:points = [[1,1],[2,2],[3,3]]输入:points = [[1,1]]原创 2024-01-08 17:18:20 · 929 阅读 · 0 评论