56-60题 题解

56Merge Intervals

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

//不明白排序函数为什么要写成静态的
/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */

class Solution {
public:
    static bool cmp(Interval a, Interval b)
    {
        if(a.start != b.start) return a.start < b.start;
        return a.end < b.end;
    }
    vector<Interval> merge(vector<Interval>& intervals) {
        if(intervals.size() <= 1) return intervals;
        sort(intervals.begin(), intervals.end(), cmp);
        vector<Interval> ans;
        int s, e;
        s = intervals[0].start;
        e = intervals[0].end;
        for(int i = 1; i < intervals.size(); i++)
        {
            int mid = intervals[i].start;
            if(s <= mid && e >= mid) e = max(intervals[i].end, e);
            else
            {
                Interval cur = Interval(s, e);
                ans.push_back(cur);
                s = mid;
                e = intervals[i].end;
            }
        }
        Interval cur = Interval(s, e);
        ans.push_back(cur);
        return ans;
    }
};


57Insert Interval

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:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

//简单模拟下
/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */

class Solution {
public:
    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
        int s = newInterval.start, e = newInterval.end;
        vector<Interval> ans;
        int i;
        for(i = 0; i < intervals.size(); i++)
        {
            if(intervals[i].end >= s) break;
            ans.push_back(intervals[i]);
        }
        if(i == intervals.size()) ans.push_back(newInterval);
        else
        {
            Interval cur;
            if(intervals[i].start <= s) cur.start = intervals[i].start;
            else cur.start = s;
            for( ; i < intervals.size(); i++)
            {
                if(intervals[i].end >= e) break;
            }
            if(i == intervals.size())
            {
                cur.end = e;
                ans.push_back(cur);
            }
            else if(intervals[i].start <= e)
            {
                cur.end = intervals[i].end;
                ans.push_back(cur);
                i++;
                for( ; i < intervals.size(); i++) ans.push_back(intervals[i]);
            }
            else
            {
                cur.end = e;
                ans.push_back(cur);
                for( ; i < intervals.size(); i++) ans.push_back(intervals[i]);
            }
        }
        return ans;
    }
};
58Length of Last Word

Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the length of last word in the string.

If the last word does not exist, return 0.

Note: A word is defined as a character sequence consists of non-space characters only.

Example:

Input: "Hello World"
Output: 5
//题虽然简单,但有点坑,注意空格的位置哈
class Solution {
public:
    int lengthOfLastWord(string s) {
        int ans = 0, res = 0;
        int len = s.length();
        for(int i = 0; i < len; i++)
        {
            if(s[i] != ' ') res++;
            else if(res) ans = res, res = 0;
        }
        if(res) ans = res;
        return ans;
    }
};


59Spiral Matrix II

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

For example,
Given n = 3,

You should return the following matrix:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]
//同54. Spiral Matrix题 模拟下
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        if(n == 0) return {};
        int res[n][n];
        int l, r, ll, rr;
        l = ll = 0;
        r = rr = n-1;
        int k = 1;
        while(true)
        {
            for(int j = ll; j <= rr; j++) res[l][j] = k++;
            if(k > n*n) break;
            for(int i = l+1; i <= r; i++) res[i][rr] = k++;;
            if(k > n*n) break;
            for(int j = rr-1; j >= ll; j--) res[r][j] = k++;
            if(k > n*n) break;
            for(int i = r-1; i > l; i--) res[i][ll] = k++;
            if(k > n*n) break;
            l++; r--;
            ll++; rr--;
        }
        vector<vector<int>> ans;
        vector<int> cur;
        for(int i = 0; i < n; i++)
        {
            cur.clear();
            for(int j = 0; j < n; j++)
                cur.push_back(res[i][j]);
            ans.push_back(cur);
        }
        return ans;
    }
};

60Permutation Sequence

The set [1,2,3,…,n] contains a total of n! unique permutations.

By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

Given n and k, return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.

//法1: STL
class Solution {
public:
    string getPermutation(int n, int k) {
        string s;
        for(int i = 1; i <= n; i++) s += i+'0';
        int cur = 0;
        do
        {
            cur++;
        }while(cur != k && next_permutation(s.begin(), s.end()) );
        return s;
    }
};
//手写的dfs, 跑的很慢,不知道人家怎么跑那么快
class Solution {
public:
    string ans;
    void dfs(int cur, int n, string &s, int &n_k, int &k)
    {
        if(cur == n)
        {
            n_k++;
            if(n_k == k) ans = s;
            return ;
        }
        string ss = s;
        for(int i = cur; i < n; i++)
        {
            ss[cur] = s[i];
            for(int j = cur+1; j <= i; j++) ss[j] = s[j-1];
            dfs(cur+1, n, ss, n_k, k);
            if(ans.length()) return ;
        }
    }
    string getPermutation(int n, int k) {
        string s;
        for(int i = 1; i <= n; i++) s += i+'0';
        int n_k = 0;
        dfs(0, n, s, n_k, k);
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值