零基础算法打卡第 11 天|LeetCode 80 删除有序数组中的重复项 II + 滑动窗口 / 双指针巩固
今天是算法学习第 11 天今天任务LeetCode 80 删除有序数组中的重复项 II在昨天去重的基础上升级允许最多出现两次超过两次才删掉顺便巩固滑动窗口 / 双指针并完成第二周学习小结。一、今日题目LeetCode 80 删除有序数组中的重复项 II1. 题目信息题目链接https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/视频讲解https://www.bilibili.com/video/BV18G5UzzE8c/2. 题意给一个非递减有序数组最多允许同一个数字出现2 次出现 3 次及以上的只保留前 2 个原地修改不能开新数组返回最终数组的新长度 k数组前 k 个就是合法结果后面不用管示例输入nums [1,1,1,2,2,3]输出5处理后[1,1,2,2,3,...]二、思路双指针 / 滑动窗口这道题是昨天26. 删除有序数组中的重复项的升级版。昨天规则最多出现 1 次今天规则最多出现 2 次思路几乎一样只改一个判断条件慢指针 slow指向当前合法数组的最后一位快指针 fast遍历每一个元素只要当前数和slow-1位置不一样就可以保留换句话说同一个数只要不连着第三次出现就留下。核心逻辑前两个元素直接保留从第三个开始检查如果nums[fast] ! nums[slow - 1]说明最多重复两次可以保留否则说明重复三次以上跳过三、完整代码C 版cpp运行class Solution { public: int removeDuplicates(vectorint nums) { int n nums.size(); if (n 2) return n; int slow 2; // 前两个一定合法 for (int fast 2; fast n; fast) { // 不和上上位重复 → 可以保留 if (nums[fast] ! nums[slow - 2]) { nums[slow] nums[fast]; slow; } } return slow; } };Python 版python运行def removeDuplicates(nums): if len(nums) 2: return len(nums) slow 2 for fast in range(2, len(nums)): if nums[fast] ! nums[slow - 2]: nums[slow] nums[fast] slow 1 return slow四、滑动窗口 / 双指针理解这道题本质就是一个滑动窗口窗口内保证相同元素最多 2 个快指针扩张窗口慢指针维护合法窗口的右边界效率时间复杂度O(n)空间复杂度O(1)完全满足题目要求。五、第二周学习小结本周学习内容链表专题环形链表 I、II快慢指针数组专题26. 删除有序数组重复项最多 1 次删除有序数组重复项 II最多 2 次两数之和哈希表核心算法快慢双指针左右指针滑动窗口思想哈希表空间换时间重要思想原地修改数组一次遍历 O (n) 思想先暴力再优化真实感受从完全看不懂指针 → 现在能秒写双指针去重从害怕哈希表 → 两数之和已经很熟练从只会嵌套循环 → 现在能写出高效算法这周进步真的特别明显遇到的难点一开始分不清slow-1和slow-2滑动窗口只懂概念不会套题目边界条件数组长度 0、1、2容易错多画几遍图、多默写一遍代码马上就通了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2551017.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!