leetcode(56-60)

56. 合并区间

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

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

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
/**
 * 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> merge(vector<Interval>& intervals) {
        vector<Interval> res;
        if(intervals.empty()) return res;
        int size = intervals.size();
        sort(intervals.begin(), intervals.end(), compare);
        res.push_back(intervals[0]);
        for(int i=0; i<size; i++){
            if(res.back().end >= intervals[i].start){
                Interval tmp = res.back();
                res.pop_back();
                tmp.end = max(tmp.end, intervals[i].end);
                res.push_back(tmp);
            } else {
                res.push_back(intervals[i]);
            }
        }
        return res;
    }
    static bool compare(Interval a, Interval b){
        return a.start<b.start;
    }
};

57. 插入区间

给出一个无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:

输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]

示例 2:

输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出: [[1,2],[3,10],[12,16]]
解释: 这是因为新的区间 [4,8][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) {
        intervals.push_back(newInterval);
        return merge(intervals);
    }
    vector<Interval> merge(vector<Interval>& intervals) {
        vector<Interval> res;
        if(intervals.empty()) return res;
        int size = intervals.size();
        sort(intervals.begin(), intervals.end(), compare);
        res.push_back(intervals[0]);
        for(int i=0; i<size; i++){
            if(res.back().end >= intervals[i].start){
                Interval tmp = res.back();
                res.pop_back();
                tmp.end = max(tmp.end, intervals[i].end);
                res.push_back(tmp);
            } else {
                res.push_back(intervals[i]);
            }
        }
        return res;
    }
    static bool compare(Interval a, Interval b){
        return a.start<b.start;
    }
};

58. 最后一个单词的长度

给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。

如果不存在最后一个单词,请返回 0 。

说明:一个单词是指由字母组成,但不包含任何空格的字符串。

示例:

输入: "Hello World"
输出: 5
class Solution {
public:
    int lengthOfLastWord(string s) {
        if(s.length()==0) return 0;
        int res=0,len=0;
        for(int i=0; i<s.length(); i++){
            if(s[i] != ' '){
                len++;
            } else if(s[i]==' ' && len!=0){
                res=len;
                len=0;
            }
        }
        if(len!=0) res=len;
        return res;
    }
};

59. 螺旋矩阵 II

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));
        int loop=n/2+1;
        int floor=0;
        int number=1;
        while(loop--){
            for(int i=floor; i<n-floor; i++) res[floor][i] = number++;
            if(loop==0 && n%2==1) break;
            for(int i=floor+1; i<n-floor; i++) res[i][n-floor-1] = number++;
            for(int i=n-floor-2; i>=floor; i--) res[n-floor-1][i] = number++;
            if(loop==0 && n%2==0) break;
            for(int i=n-floor-2; i>floor; i--) res[i][floor] = number++;
            floor++;
        }
        return res;
    }
};

60. 第k个排列

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 = 3 时, 所有排列如下:

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

给定 n 和 k,返回第 k 个排列。

说明:

  • 给定 n 的范围是 [1, 9]。
  • 给定 的范围是[1,  n!]。

示例 1:

输入: n = 3, k = 3
输出: "213"

示例 2:

输入: n = 4, k = 9
输出: "2314"
class Solution {
public:
    string getPermutation(int n, int k) {
        vector<int> nums;
        string res;
        for(int i=1; i<=n; i++) nums.push_back(i);
        for(int i=1; i<k; i++) nextPermutation(nums);
        for(int i=0; i<nums.size(); i++) res+=nums[i]+'0';
        return res;
    }
    void nextPermutation(vector<int>& nums) {
        int n=nums.size();
        for(int i=n-1;i>=0;i--){
            for(int j=n-1;j>i;j--){
                if(nums[i]<nums[j]){
                    swap(nums[i],nums[j]);
                    sort(nums.begin()+i+1,nums.end());
                    return;
                }
            }
        }
        sort(nums.begin(),nums.end());
    }
}; 

(以上题目均摘自leetcode)

猜你喜欢

转载自blog.csdn.net/github_37002236/article/details/83305294