用wordpress仿一个网站模板下载网站开发毕业设计中期检查表
用wordpress仿一个网站模板下载,网站开发毕业设计中期检查表,e福州电子公交卡,微信建站官网免费注册1 题目
904. 水果成篮
你正在探访一家农场#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。
你想要尽可能多地收集水果。然而#xff0c;农场的主人设定了一些严格的规矩#xff0c;你必…1 题目904. 水果成篮你正在探访一家农场农场从左到右种植了一排果树。这些树用一个整数数组fruits表示其中fruits[i]是第i棵树上的水果种类。你想要尽可能多地收集水果。然而农场的主人设定了一些严格的规矩你必须按照要求采摘水果你只有两个篮子并且每个篮子只能装单一类型的水果。每个篮子能够装的水果总量没有限制。你可以选择任意一棵树开始采摘你必须从每棵树包括开始采摘的树上恰好摘一个水果。采摘的水果应当符合篮子中的水果类型。每采摘一次你将会向右移动到下一棵树并继续采摘。一旦你走到某棵树前但水果不符合篮子的水果类型那么就必须停止采摘。给你一个整数数组fruits返回你可以收集的水果的最大数目。示例 1输入fruits [1,2,1]输出3解释可以采摘全部 3 棵树。示例 2输入fruits [0,1,2,2]输出3解释可以采摘 [1,2,2] 这三棵树。 如果从第一棵树开始采摘则只能采摘 [0,1] 这两棵树。示例 3输入fruits [1,2,3,2,2]输出4解释可以采摘 [2,3,2,2] 这四棵树。 如果从第一棵树开始采摘则只能采摘 [1,2] 这两棵树。示例 4输入fruits [3,3,3,1,2,1,1,2,3,3,4]输出5解释可以采摘 [1,2,1,1,2] 这五棵树。提示1 fruits.length 1050 fruits[i] fruits.length2 代码实现class Solution { public: int totalFruit(vectorint fruits) { unordered_mapint, int window ; int left 0 ; int right 0; int n fruits.size(); int res 0 ; while(right n ){ int a fruits[right]; right; window[a]; while(window.size() 2){ int b fruits[left]; left; window[b]--; if(window[b] 0){ window.erase(b); } } res max(res , right - left); } return res; } };两段代码中left和right的更新位置不同但结果却都正确。class Solution { public: int totalFruit(vectorint fruits) { unordered_mapint, int window ; int left 0 ; int right 0; int n fruits.size(); int res 0 ; while(right n ){ int a fruits[right]; window[a]; while(window.size() 2){ int b fruits[left]; window[b]--; left; if(window[b] 0){ window.erase(b); } } right; res max(res , right - left); } return res; } };这两种写法只是调整了 “元素入窗” 和 “指针移动” 的先后顺序最终维护的滑动窗口的有效范围是完全一致的因此计算出的窗口长度也会相同。思考一点思路都没有这个和滑动窗口有什么关系问题与滑动窗口的关联分析首先我们把问题转化一下两个篮子对应最多两种水果类型。必须从左到右连续采摘对应数组的连续子数组。要收集最多水果对应找最长的符合条件的子数组。fruits[i]中的每个数字确实只是水果类别的标识不同的数字代表不同种类的水果相同的数字代表同一种类的水果这是典型的滑动窗口双指针问题属于“最长子数组最多包含 k 种元素” 的特例这里 k2。滑动窗口的核心是用左右指针维护一个窗口保证窗口内的元素满足 “最多两种类型”。同时不断扩大右指针当窗口内元素超过两种时移动左指针收缩窗口过程中记录窗口的最大长度。我想大概这么实现条件是最多包含2个元素然后根据条件约束好滑动窗口的边界。怎么实现最多包含2个元素可以用 unordered_map 来记录当前窗口内每种水果类别数字的数量类别数量就是这个map对应的size()。错误百出的代码class Solution { public: int totalFruit(vectorint fruits) { unordered_mapint, int window ; int left 0 ; int right 0; int n fruits.size(); int res 0 ; while(right n ){ int a fruits[right]; right; window[a]; while(window.size() 2){ int b fruits[left]; left; window[b]--; } res max(res , right - left); } return res; } };错误分析举个例子比如输入fruits [1,2,3,2,2]当right遍历到索引 2水果 3时window中是{1:1, 2:1, 3:1}window.size()3进入内层循环。左指针left指向索引 0水果 1执行window[1]--后window[1]变为 0但没有删除键 1此时window.size()仍然是 3。内层循环会继续执行left继续右移到索引 1水果 2执行window[2]--window[2]变为 0还是没删除键 2window.size()依旧是 3。这会导致左指针被过度移动最终计算的窗口长度会偏小得到错误的结果。3 题目1695. 删除子数组的最大得分给你一个正整数数组nums请你从中删除一个含有若干不同元素的子数组。删除子数组的得分就是子数组各元素之和。返回只删除一个子数组可获得的最大得分。如果数组b是数组a的一个连续子序列即如果它等于a[l],a[l1],...,a[r]那么它就是a的一个子数组。示例 1输入nums [4,2,4,5,6]输出17解释最优子数组是 [2,4,5,6]示例 2输入nums [5,2,1,2,5,2,1,2,5]输出8解释最优子数组是 [5,2,1] 或 [1,2,5]提示1 nums.length 1051 nums[i] 1044 代码实现class Solution { public: int maximumUniqueSubarray(vectorint nums) { unordered_mapint,int window ; int left 0 ; int right 0 ; int curSum 0; int sum 0 ; while(right nums.size()){ int a nums[right]; curSumnums[right]; right; window[a]; while(window[a] 1){ int b nums[left]; curSum - nums[left]; left; window[b]--; } sum max(sum ,curSum); } return sum ; } };思考啥玩意就是找一个子数组。要求连续没有相同的元素。子数组的和最大最后返回一下这个子数组相加的和。哈哈看着高级的描述其实就是一个不定长的滑动窗口罢了。我的思路1.连续这就是滑动窗口嘛。2.没有重复的元素每一个进入窗口的元素都用unordered_map记录int ,int 存放元素和出现次数如果对应的value 1 处理窗口。3.子数组的和最大定义一个sum每次处理窗口发生滑动的时候更新sum的值并且用max更新保持这个值最大。又写错了class Solution { public: int maximumUniqueSubarray(vectorint nums) { unordered_mapint,int window ; int left 0 ; int right 0 ; int sum 0 ; while(right nums.size()){ int curSum 0; int a nums[right]; right; window[a]; curSumnums[right]; while(window[a] 1){ int b nums[left]; left; window[b]--; curSum - nums[left]; } sum max(sum ,curSum); } return sum ; } };代码中的关键错误curSum的初始化位置错误你把curSum放在while循环内部每次循环都会重置为 0导致无法累加窗口内的元素和。访问数组越界right后直接执行curSum nums[right]当right到达数组末尾时nums[right]会访问到数组外的元素触发越界错误。求和与减和的逻辑错误累加时应该加当前的a即nums[right-1]而不是nums[right]。收缩窗口时应该减当前的b即nums[left-1]而不是nums[left]且减和操作应该和left移动对应。收缩窗口的条件错误while(window[a] 1)只判断当前元素a的重复情况但窗口内可能存在其他元素重复的情况比如窗口内有[1,2,1,3]此时3不重复但1重复你的条件无法检测到正确的条件应该是检查当前元素的计数是否大于 1或用哈希集合判断是否存在。自行修正了代码实现开头见。5 小结做了这么几题以后我对不定长窗口的题目有了自己的理解。无非就是抽象题目意思以后做好约束条件更新滑动窗口值得注意的是边界更新顺序还有一些我没有常用的语法细节。比如unordered_map的erasesize都是这两道题目教会我这么实践的。算法题没有那么可怕真的静下心来我发现我毫无思路的时候很大程度是没有理解题目的意思。比如第一题我以为数字代表的是树上可以摘的水果有多少类正确的理解是不同的数字对于不同水果只是一个id。这就属于我理解上的偏差所以题目读不懂。加油(ง •_•)ง我在进步至少现在的学习方式是好的自己梳理思路梳理不通求助ai再自己组织代码报错的地方让ai帮忙找问题知道问题所在以后自己改正一直改到对。全程要自己主导我不再盲目抄ai的正确代码了