挑战LeetCode热题100(TS版本)打卡第四天

65 阅读2分钟

挑战LeetCode热题100(TS版本)

打卡第四天

1.最大子数组和

子数组 是数组中的一个连续部分。

示例 1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入: nums = [1]
输出: 1

示例 3:

输入: nums = [5,4,-1,7,8]
输出: 23

思路:贪心算法

function maxSubArray(nums: number[]): number {
    // 贪心算法
    const INT32_MIN = -Math.pow(2, 31);
    let max = INT32_MIN
    let count = 0
    for(let i=0;i<nums.length;i++) {
        count+=nums[i]
        if(count > max) {
            max = count
        }
        if(count < 0) count = 0
    }

    return max
};

2. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3][2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

思路:排序+循环处理

function merge(intervals: number[][]): number[][] {
    const sortIntervals = intervals.sort((a,b) => a[0] - b[0])
    const result = []
    if(intervals.length === 0) return result
    if(intervals.length === 1) return [intervals[0]]
    let count  = intervals[0]
    let i = 1
    while(i < intervals.length) {
       if(sortIntervals[i][0] <= count[1]) {
            result.pop()
            result.push([Math.min(count[0], sortIntervals[i][0]), Math.max(count[1], sortIntervals[i][1])])
        } else {
            if(i === 1) {
                result.push(count)
            }
            result.push(sortIntervals[i])
        }
        i++
        count = result[result.length - 1]
    }
    return result
};

总结

  • 第一道题使用了贪心算法(每次只要小于0就丢弃),做到时间复杂度为O(n),空间复杂度O(1)
  • 第二道题在解决方案上优先排序,再进行处理,并不是一个好的方案。做到时间复杂度O(nlogin(n)),空间复杂度O(n)