LeetCode 排序 题库

本文探讨了几种与排序和会议室管理相关的LeetCode问题,包括判断会议能否安排、最小会议室需求以及不同场景下的排序策略。通过排序优化,实现了有效解决这些问题的算法,并给出了详细的代码实现,涉及到了二分查找、贪心策略和三向切分等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序题单

困了累了做排序。

lc.252 会议室

class Solution {
public:
    bool canAttendMeetings(vector<vector<int>>& intervals) {
        sort(intervals.begin() , intervals.end()) ;
        for(int i = 1 ; i < intervals.size() ; i ++){
            if(intervals[i][0] < intervals[i - 1][1]) return false; 
        }
        return true ;
    }
};

lc.253 会议室 II

  • 有空闲的房间就进,没有就新开一个房间
class Solution {
public:
    int minMeetingRooms(vector<vector<int>>& intervals) {
        vector<int> EndTime ;
        int ans ;
        sort(intervals.begin() , intervals.end()) ;
        EndTime.emplace_back(intervals[0][1]) ;
        for(int i = 1 ; i < intervals.size() ; i ++){
            int flag = 0 ;
            for(int j = 0 ; j < EndTime.size() ; j ++){
                if(intervals[i][0] < EndTime[j]){
                    flag ++ ;
                }
                else{
                    EndTime[j] = intervals[i][1] ;
                    break ;
                }
            }
            if(flag == EndTime.size()) EndTime.emplace_back(intervals[i][1]) ;
        }
        return (int)EndTime.size() ;
    }
};

lc.259 较小的三数之和

class Solution {
public:
    int threeSumSmaller(vector<int>& nums, int target) {
        int ans = 0 ;
        if(nums.size() < 3) return 0 ;
        sort(nums.begin() , nums.end()) ;
        for(int i = nums.size() - 1 ; i >= 0 ; i --){
            int sum = target - nums[i] ;
            int l = 0 , r = i - 1 ;
            while(l < r){
                int presum = nums[l] + nums[r] ;
                if(presum >= sum) r -- ;
                else {
                    ans += r - l ;
                    l ++ ;
                }
            }
        }
        return ans ;
    }
};

sort结束后从后遍历,如果k的值小于target,将剩余的值在 0 ~ k-1 中查找答案。注意到一旦反向找到结果加上的是剩余范围的所有值ans += r - l ;

lc.280 摆动序列

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        sort(nums.begin() , nums.end());
        for(int i = 1 ; i < nums.size() - 1 ; i += 2){
            swap(nums[i] , nums[i + 1]) ;
        }
        return ;
    }
};

sort 结束 从第二个位置开始两两互换。

  • 贪心
class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        for (int i = 0; i < nums.size() - 1 ; i ++) {
            if (((i % 2 == 0) && nums[i] > nums[i + 1]) || ((i % 2 == 1) && nums[i] < nums[i + 1])) {
                swap(nums[i], nums[i + 1]);
            }
        }
        return ;
    }
};

每次只考虑当前位置和下一位置,如果满足条件不动,不满足就交换一次。

lc.324 摆动序列 II

这题就不能用 lc.280 的两种方法来实现了。

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        auto midptr = nums.begin() + nums.size() / 2;
        nth_element(nums.begin(), midptr, nums.end());
        int mid = *midptr;
        
        // 3-way-partition
        int i = 0, j = 0, k = nums.size() - 1;
        while(j < k){
            if(nums[j] > mid){
                swap(nums[j], nums[k]);
                --k;
            }
            else if(nums[j] < mid){
                swap(nums[j], nums[i]);
                ++i;
                ++j;
            }
            else{
                ++j;
            }
        }
        
        if(nums.size() % 2) ++midptr;
        vector<int> tmp1(nums.begin(), midptr);
        vector<int> tmp2(midptr, nums.end());
        for(int i = 0; i < tmp1.size(); ++i){
            nums[2 * i] = tmp1[tmp1.size() - 1 - i];
        }
        for(int i = 0; i < tmp2.size(); ++i){
            nums[2 * i + 1] = tmp2[tmp2.size() - 1 - i];
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值