美文网首页
合并区间 + 颜色分类

合并区间 + 颜色分类

作者: 吃掉夏天的怪物 | 来源:发表于2021-07-09 17:28 被阅读0次

    合并区间

    重点是vector的用法,都忘记了还可以.back,而且vector<vector<int>>也可以直接sort()

    class Solution {
    public:
        vector<vector<int>> merge(vector<vector<int>>& intervals) {
            int n = intervals.size();
            if(n == 0) return {};
            sort(intervals.begin(),intervals.end());
            vector<vector<int>> res;
            for(int i = 0; i < n; i++){
                int L = intervals[i][0], R = intervals[i][1];
                if(res.empty() || res.back()[1]<L){
                    res.push_back({L,R});
                }else{
                    res.back()[1] = max(res.back()[1],R);//注意,更新为两个中的最大值
                }
            }
            return res;
    
        }
    };
    

    颜色分类

    以为是一道快排题,结果有好多种做法。

    方法一: 单指针

    循环两次,第一次把0放在最前面,第二次把1都放在0后面,排序结束。

    方法二:双指针

    设置两个指针ptr0ptr1,遍历到1时与ptr1指向的数字交换,并将ptr1++;遍历到0的时候,需要处理ptr0指针在ptr1之前,的情况。
    为避免将1交换出去,需要先把0与ptr1交换,再交换ptr0ptr1。这样1就能顺次排在一堆1的后面了。

    class Solution {
    public:
        void sortColors(vector<int>& nums) {
            int ptr0 = 0, ptr1 = 0;
            int n = nums.size();
            for(int i = 0; i<n; i++){
                if(nums[i] == 1){
                    swap(nums[ptr1],nums[i]);
                    ptr1++;
                }
                if(nums[i] == 0){
                    if(ptr0 < ptr1){
                        swap(nums[ptr1],nums[i]);
                        swap(nums[ptr1],nums[ptr0]);
                        
                    }else{
                        swap(nums[ptr0],nums[i]);
                    }
                    ptr0++;
                    ptr1++;
                }
            }
        }
    };
    

    方法三:双指针

    image.png

    方法四: 快排

    class Solution {
    public:
        void quickSort(vector<int>& nums,int l, int r){
            if(l >= r) return ;
            int i = l, j = r;
            int pivot = nums[i];
            while(i < j){
                while(i < j && nums[j] >= pivot){j--;}
                nums[i] = nums[j];
                while(i < j && nums[i] < pivot){i++;}
                nums[j] = nums[i];
            }
            nums[i] = pivot;
            quickSort(nums,l,i-1);
            quickSort(nums,i+1,r);
            
        }
        void sortColors(vector<int>& nums) {
            int n = nums.size();
            quickSort(nums,0,n-1);
        }
    };
    

    相关文章

      网友评论

          本文标题:合并区间 + 颜色分类

          本文链接:https://www.haomeiwen.com/subject/cfzzultx.html