leetcode-56.合并区间;189. 轮转数组

47 阅读1分钟

56.合并区间

1、把区间按照左端点从小到大排序

2、将第一个区间加入 merged 数组中,并按顺序依次考虑之后的每个区间:

3、重点:

a)如果当前区间的左端点 > merged的右端点,那么它们不会重合,直接将这个区间加入数组 merged 的末尾;

b)如果当前区间的左端点 < merged的右端点,那么这两个区间会重合,用当前区间的右端点更新数组 merged 中最后一个区间的右端点,将其置为二者的较大值。

var merge = function(intervals) {
    let merged = []
    // let n = intervals.length;
    // for (let i = 0; i < n - 1; i++) {
    //     for (let j = 0; j < n - 1 - i; j++) {
    //         if (intervals[j][0] > intervals[j + 1][0]) {
    //             // 交换区间
    //             let temp = intervals[j];
    //             intervals[j] = intervals[j + 1];
    //             intervals[j + 1] = temp;
    //         }
    //     }
    // }

    intervals.sort((a, b) => a[0] - b[0]);
    for(let i = 0; i < intervals.length; i++){
        let len = merged.length;
        if(!merged.length ||intervals[i][0] > merged[len - 1][1]){
           // 如果 merged 为空或者当前区间的左端点大于 merged 最后一个区间的右端点,直接添加
            merged.push(intervals[i])
        }else{
            // 若 当前区间左端点小于merged最后一个区间的右端点,更新merged的右端点为当前区间的右端点
            merged[len - 1][1] = Math.max(merged[len - 1][1], intervals[i][1]);
        }
    }
    return merged;
};

189. 轮转数组

方法一:

1、遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)modn 的位置

2、将新数组拷贝至原数组

var rotate = function(nums, k) {
    let n = nums.length;
    let newArr = new Array(n);
    for(let i = 0; i < n; i++){
        newArr[(i + k) % n] = nums[i];
    }
    for(let i = 0; i < n; i++){
        nums[i] = newArr[i];
    }
};

方法二: