挑战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)