• 算法day36|435,763,56


    435. 无重叠区间

    1. class Solution:
    2. def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
    3. intervals.sort(key=lambda x:x[1])
    4. count = 1
    5. end = intervals[0][1]
    6. for i in range(1,len(intervals)):
    7. if end <= intervals[i][0]:
    8. count += 1
    9. end = intervals[i][1]
    10. return len(intervals)-count

    总结如下难点:

    • 难点一:一看题就有感觉需要排序,但究竟怎么排序,按左边界排还是右边界排。
    • 难点二:排完序之后如何遍历,如果没有分析好遍历顺序,那么排序就没有意义了。
    • 难点三:直接求重复的区间是复杂的,转而求最大非重复区间个数。
    • 难点四:求最大非重复区间个数时,需要一个分割点来做标记。

    我不知道怎么说这道题,又好像很难,又没有很难,因为你知道了想法后,我也不知道难在哪里?就很玄学,不知道想法就是想不出


     

    二刷(ac)

    1. var eraseOverlapIntervals = function(intervals) {
    2. // 排序,根据第一个数
    3. intervals.sort((a,b)=>{
    4. if(a[0]!== b[0]){
    5. return a[0]-b[0]
    6. }else{
    7. return a[1]-b[1]
    8. }
    9. })
    10. let result = 0
    11. for(let i = 1;i<intervals.length;i++){
    12. if(intervals[i-1][1]>intervals[i][0]){
    13. result ++
    14. intervals[i][1] = Math.min(intervals[i-1][1],intervals[i][1])
    15. }
    16. }
    17. return result
    18. };

    763.划分字母区间

    一旦看了解释,就知道怎么写这个题目了。了解了后就很简单

    1. class Solution:
    2. def partitionLabels(self, s: str) -> List[int]:
    3. #使用hashmap 记录每个字母的最大坐标值
    4. hashmap = [0]*26
    5. result = []
    6. right = 0
    7. left = 0
    8. for i in range(len(s)):
    9. hashmap[ord(s[i])-ord('a')] = i
    10. #遍历字符串,如果遍历的下标值为最大下标值,则加入结果集中
    11. for i in range(len(s)):
    12. right = max(right,hashmap[ord(s[i])-ord('a')])
    13. if i == right:
    14. #加入的是区间,而不是坐标
    15. result.append(right-left+1)
    16. left = i+1
    17. return result

    y代码随想录

    二刷(ac):好开心,我又ac了

    1. var partitionLabels = function(s) {
    2. let result = []
    3. // 存放最远下标
    4. let end = 0
    5. let start = 0
    6. // 用来存放索引和下标
    7. let arr = new Array(26).fill(0)
    8. // 感觉是得记住每个字符的下标和对应的字符,然后贪心的找到最远的字符的下标,记录一下。
    9. for(let i = 0;i<s.length;i++){
    10. arr[s[i].charCodeAt()-'a'.charCodeAt()] = i
    11. }
    12. for(let i = 0;i<s.length;i++){
    13. // 找到每个字符的的最远下标
    14. end = Math.max(arr[s[i].charCodeAt()-'a'.charCodeAt()],end)
    15. //如果当前字符下标等于最远字符下标
    16. if(i === end){
    17. //将结果放入
    18. result.push(end-start+1)
    19. // 更新start
    20. start = end+1
    21. }
    22. }
    23. return result
    24. };

    56. 合并区间

    1. class Solution:
    2. def merge(self, intervals: List[List[int]]) -> List[List[int]]:
    3. #排序,按照x[1]排序
    4. intervals.sort(key=lambda x:x[0])
    5. result = []
    6. result.append(intervals[0])
    7. for i in range(1,len(intervals)):
    8. if result[-1][1] >= intervals[i][0]:
    9. result[-1] = [result[-1][0],max(result[-1][1],intervals[i][1])]
    10. else:
    11. result.append(intervals[i])
    12. return result

    我的大概思路是对的,但是不知道怎么合并

    题解给出的方法是,先将第一个区间加入结果集中,直接变换结果集里面的数。

    代码随想录

    二刷:(未ac)

    还是合并区间这一部分没写出来

    1. var merge = function (intervals) {
    2. let result = []
    3. // 先根据左边排序,从小到大
    4. intervals.sort((a, b) => {
    5. return a[0] - b[0]
    6. })
    7. console.log(intervals)
    8. result.push(intervals[0])
    9. for (let i = 1; i < intervals.length; i++) {
    10. // 合并,如果碰到区间内,或者是连着的话,合并一下
    11. if (intervals[i][0] <= result[result.length - 1][1]) {
    12. //更新右边界
    13. result[result.length - 1][1] = Math.max(result[result.length - 1][1], intervals[i][1])
    14. } else {
    15. result.push(intervals[i])
    16. }
    17. }
    18. return result
    19. };

    复习day6

    写完笔记丢失了。。。。随便记一下把

    快乐数不熟悉

    不知道如何处理数:n//10取整数,n%10 取余

    两数之和

    只需要遍历一次数组,记录已经经过的数值,方面后面查找

  • 相关阅读:
    hdu7244-Winner Prediction(22多校第十场1001 dinic最大流)
    map的键值可以重复吗
    python使用memory_profiler分析代码运行内存占用
    基于Java+SpringBoot+Thymeleaf+Mysql在线电子书阅读系统学习系统设计与实现
    C# Winform编程(4)多文档窗口(MDI)
    Linux 权限
    Qt第八章:安装Qt Creator教程
    高压差分探头导致的驱动电压离谱的原因
    VMware使用Window、WinXP等虚拟机上不了网的解决办法(管用)
    elk+logback实现SpringBoot日志分布式收集
  • 原文地址:https://blog.csdn.net/weixin_42173016/article/details/128125438