ARTS 第18周

2019-08-08  本文已影响0人  陈卧虫

ARTS 第18周分享

[TOC]

Algorithm

56. Merge Intervals

[medium]

[题目描述]

Given a collection of intervals, merge all overlapping intervals.

Example 1:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

[解题思路]

[参考代码]

func merge(intervals [][]int) [][]int {
    /*
    // 先将整个集合中的所有区间按从小到大排序,
    // 遍历整个区间集合
        // 判断相邻的两个区间:左边区间的结尾 与 右边区间的开始比较,
        // 如果 左结尾大于等于右开始,将两区间合并,存入一个新的集合,否则,直接存入
    // 返回新的集合
    */

    // 先将整个集合中的所有区间按从小到大排序,
    quickSortIntervals(intervals, 0, len(intervals)-1)

    //tmp := make([][]int, 0)
    // 遍历整个区间集合
    for i := 0; i < len(intervals)-1; {
        // 判断相邻的两个区间:左边区间的结尾 与 右边区间的开始比较,
        // 如果 左结尾大于等于右开始,将两区间合并,存入一个新的集合,否则,直接存入
        if intervals[i][1] >= intervals[i+1][0] {

            if intervals[i][1] <= intervals[i+1][1] {
                intervals[i+1][0] = intervals[i][0]
                intervals = append(intervals[:i], intervals[i+1:]...)
            } else {
                intervals = append(intervals[:i+1], intervals[i+2:]...)
            }
        } else {
            i++
        }
    }
    return intervals
}

func quickSortIntervals(intervals [][]int, left, right int) {
    // 选择一个主元,将大于移到主元的右边,小于的移动到右边
    // 将主元左边的元素再次进行排序操作, 左右两边为同一个元素
    if left >= right {
        return
    }
    mid := partition(intervals, left, right)

    // left
    quickSortIntervals(intervals, left, mid-1)
    quickSortIntervals(intervals, mid+1, right)
}

// 对半排序
func partition(intervals [][]int, left, right int) (mid int) {
    /*
    将最有一个元素当做主元,用一个指针从数组的倒数第二个开始遍历这个数组,用另一个指针指向数组的开头
    遍历整个数组,直到两个指针相交
    将主元置于中间
    */
    pivot := intervals[right][0]
    v := left
    r := right - 1

    for v <= r {
        if intervals[r][0] < pivot {
            intervals[v], intervals[r] = intervals[r], intervals[v]
            v++
        } else {
            r--
        }
    }

    intervals[v], intervals[right] = intervals[right], intervals[v]
    return v
}

57. Insert Interval

[hard]

[题目描述]

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:

Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]

[解题思路]

[参考代码]

func insert(intervals [][]int, newInterval []int) [][]int {
    // 将新的端点插入到列表中,然后重新排序

    // 判断是否为空
    if len(intervals) == 0 {
        return append(intervals, newInterval)
    }

    // 将新端点有序的插入
    i := 0
    for i=0; i<len(intervals); i++ {
        if intervals[i][0] >= newInterval[0] {
            break
        }
    }
    rear := append([][]int{}, intervals[:]...)
    intervals = append(intervals[:i], newInterval)
    intervals = append(intervals, rear...)

    // 合并重复的元素: 将不重合的元素存入到新数组中,
    // 遍历所有元素,将当前遍历到的元素与新数组中的最后一个元素对比,如果重合就去重;如果不重合直接存入新数组中
    new := make([][]int, 0)
    new = append(new, intervals[0])
    for i:=1; i<len(intervals); i++ {
        if new[len(new)-1][1] >= intervals[i][0] {
            if new[len(new)-1][1] < intervals[i][1] {
                new[len(new)-1][1] = intervals[i][1]
            }
        } else {
            new = append(new, intervals[i])
        }
    }
    return new
}

Review

Tips

分库分表实践:https://mp.weixin.qq.com/s/cGJIjv3ep-6whkC0j6878A

share

什么是CDN:https://mp.weixin.qq.com/s/msmYsB_tviixfbWMKlvu8g

缓存雪崩和缓存击穿的区别:

本周阅读

第五周:1, 2, 3, 5
如何找到两个数组的中位数: https://mp.weixin.qq.com/s/OE4lHO8-jOIxIfWO_1oNpQ
数据库软件架构,到底要设计些什么?: https://mp.weixin.qq.com/s/yyh013dDNfaiT0wtBihCLQ
分库分表实践: https://mp.weixin.qq.com/s/cGJIjv3ep-6whkC0j6878A
Go module的使用: https://mp.weixin.qq.com/s/1GbOOJ0UdbvanObLGKbzfg
一次使用 Go 语言编写脚本的经历: https://mp.weixin.qq.com/s/57vCEHqiLC_V6Re4J0M0YQ

清晰胜过聪明: https://mp.weixin.qq.com/s/rhlr_l4o2py87kS3PIuZVg
搞明白CDN: https://mp.weixin.qq.com/s/msmYsB_tviixfbWMKlvu8g
分布式系统关注点——缓存背后的“毁灭种子”: https://mp.weixin.qq.com/s/q-R7kv4696LooHy3Hn-H1A
什么叫 CQRS: https://mp.weixin.qq.com/s/YBzq1vobSaIQkxnYhKWQIQ
Linux是怎么来的?https://mp.weixin.qq.com/s/HiPFE34P7AkNBNdRkLti4A

并发用户数与TPS之间的关系: https://www.cnblogs.com/qmfsun/p/5511557.html
多账户的统一登录方案:https://mp.weixin.qq.com/s/rI5XGtsBGISLgJvSrcHkGg
Zookeeper请求处理原理分析: https://mp.weixin.qq.com/s/At0dcl97ywcY0uLsEuuX1A

华为得到的,小米坚持的,拼多多的真正红利: https://mp.weixin.qq.com/s/DsfG7ZWqjhphkr4kvmFDSw
上一篇 下一篇

猜你喜欢

热点阅读