Leetcode刷题(Week3)——贪心专题

刷题时间: 2019/04/07 – 2019/04/08
主播:yxc(闫雪灿)
视频链接: https://www.bilibili.com/video/av32864007/?p=1

题号 题目 链接
134 Gas Station https://leetcode.com/problems/gas-station/
860 Lemonade Change https://leetcode.com/problems/lemonade-change/
392 Is Subsequence https://leetcode.com/problems/is-subsequence/
455 Assign Cookies https://leetcode.com/problems/assign-cookies/
55 Jump Game https://leetcode.com/problems/jump-game/
45 Jump Game II https://leetcode.com/problems/jump-game-ii/
376 Wiggle Subsequence https://leetcode.com/problems/wiggle-subsequence/
406 Queue Reconstruction by Height https://leetcode.com/problems/queue-reconstruction-by-height/
32 Longest Valid Parentheses https://leetcode.com/problems/longest-valid-parentheses/
152 Maximum Product Subarray https://leetcode.com/problems/maximum-product-subarray/

解题心得

No.134 加油站 (AC)

  • 找出从哪个加油站出发能环形走一圈。
  • 先找到油 > 花费的站点,然后遍历一遍,看能否到达每个站点,最终回到出发的位置。

No.860 能否完全找零(AC)

  • 贪心算法
  • 用两个变量记录两种可用于找零的零钱(5, 10)的数量
  • 判断当前需找零数能否由当前零钱凑得

No.392 判断s是否为t的子序列(AC)

  • 用两个指针分别从前往后扫

No.455 分饼干(AC)

  • 排序后,先满足需求量较小的孩子

No.55 跳跃游戏(AC)

  • 思路很简单,但代码细节要要特别注意,容易写错。
  • eg: Input: [2,3,1,1,4] Output: true;
  • 只需要比较从当前位置走向下一步时, 所剩步数和下一位置可前进步数,当前所剩步数更大,则可前进最大步数不用更新,否则更新为下一步的可前进步数。

No.45 跳跃游戏进阶(AC)

  • 同上一题,也是代码的细节处要注意,尤其是边界情况
  • 每走到一步,要判断从当前处出发能跳跃的最大步数中间,有没有能达到更远距离的情况(循环判断,记录最大步数和对应的位置),如果有,则更新。需要注意的一点是,如果从当前步能直接达到末尾,那么不需要更新步数,直接达到末尾即可。
  • nums.size()做减法的时候,如果差小于0,nums.size() - n 会从负数转换成无符号数,将会是一个非常大的数。因此为了避免这个问题,用nums.size()做减法时, 先将他转换成int类型。如:(int)nums.size()

No.376 求最长摆动子序列(前后两个数的差正好是(负)正负正负分布)(AC)

  • 本题可以通过前后两个数相乘是否为负,来判断前后两个数是否符合正负摆动。
  • 需要特别注意的是,前后两个数相同,此时他们的差为0,会破坏上面的规则。为了避免0带来的印象,可以先将差数组中所有0删去。删的时候从后往前操作,删最后一个元素时,用nums.erase(nums.begin() + len - 1),用nums.erase(nums.end())会出错。
  • 代码中细节较多,写完之后可以用几个测试用例检查一下。
  • 删除vector数组中重复元素,相同元素仅保留一个。nums.erase(unique(nums.begin(), nums.end()), nums.end());

No.406 按指定规则排序(–>AC)

  • 题目的思路比较巧妙。个高的人“看不见”个矮的,也就是说个高的排列之后个矮的可以随便排列。
  • 因此,先进行一个预排序,个高的排前面,个相同的按照第二个参数(他前面比他高的人数K)升序排列。因为,身高相同的情况下,k大的一定会在后面。这里会涉及到自定义sort中的compare函数,compare函数要定义在原本的类外面。
  • 排序的时候按照元素的第二个元素k将当前元素插入到第k个位置。for (auto p : people) res.insert(res.begin()+ p.second, p);

No. 32 求最长的合法括号长度 (WA–>AC)

  • 双指针扫描,分别指向合法串的首尾。’(’ 当做 ‘+1’, ‘)’ 当做‘-1’,(当然反向处理时调过来)当sum的值为0时,更新一下res,当sum < 0时,将其置为0.
  • 从前往后,从后往前做两遍,保留最大的长度. 这样做的目的是避免()(()(),这种情况,前后算两遍可以保证能把最大子串的长度求出来。
  • 初始的方式是用动态规划来做,提交WA,原因可以根据()()(()来分析。结果应该输出4,用原本的DP 方法会输出6。

No.152 找一个乱数数组中连续相乘最大的值(AC)

  • 贪心的思想来做。DP也可以做,没有贪心的思路简洁。
  • 记录一个最大的乘积的正数值和负数值。题目中的边界条件比较多,需要仔细考虑。比如:仅一个数且为负;含0;正负交替出现(1,-2,3, -4…)

附:
Leetcode刷题(Week3)——贪心专题_第1张图片

你可能感兴趣的:(Leetcode)