[学习报告]《LeetCode零基础指南》(第五讲) 排序

本文分享了作者在LeetCode上通过排序和双指针解决数组问题的技巧和经验,包括如何使用C++的排序函数以及在不同场景下的应用。文章以三个具体的题目为例,讲解了最小时间差、救生艇和最大间距问题的解决方案,展示了排序和双指针在算法中的应用。
摘要由CSDN通过智能技术生成

千山万水总有路,勇敢迈出第一步!!!

今日套餐【1 红 3 橙 4 绿 】,竟然看到了红题。BUT 对我而言,最小时间差 才是真的  👈 山丹丹花开红艳艳的 红 !

言前面】排序很重要,和我一样重要。如果,数组、指针说的是查找,今天就是排序  👈 废话 🤦‍👉 我只用到了以下排序的知识

  1. std::sort(begin(vec), end(vec));
  2. 参考 1 👆 

八大排序,学习时,做 【三好学生】:好好掌握理论,好好锻炼思维,好好走时间复杂度的优化过程。BUT,LeetCode,你只有 C++ 算法库 一个选项呀。别用自己的,除非你不在乎输赢 ~ 

一、吹逼

今日学习内容:https://bbs.csdn.net/topics/605680337

你觉得今天的 LeetCode 和排序有关吗?有,思维相关,先排序,后操作,体会一下
上实操,这行了解后粘贴一下 std::sort(begin(vec), end(vec)); 呀

今日最牛,905. 按奇偶排序数组,忍不住 装13。

双指针,核心理念左右指针,相向而行,相遇即终止 👇

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        while(left < right) {    // 左右相向而行,相遇即终止
            // 左奇数 和 右偶数交换,左右指针各自向前
            if(nums[left]%2==1 && nums[right]%2==0) {
                swap(nums[left], nums[right]);
                left++;
                right--;
            } 
            else if(nums[left]%2==0) left++;    // 左偶数,自己走
            else if(nums[right]%2==1) right--;    // 右奇数,自己走
        }

        return nums;
    }
};

二、晒战绩

话不多说,上图~ 👇 

三、写解题报告

题解报告,只写让我有 

 的那道题!

先来 C++ 算法库 排序 知识点,针对不同场景,可自由搭配高性能套餐,C++ 就是贴心【fan - ren】
>>> C++ 算法库 排序(命名空间 std::),底层是 O(N·log(N)) 三路快排 👈 。所以,最好在顺序容器 array/vector 上调用

  1. stable_sort:排序后,仍能保持元素的相对顺序,好稳定的。stable 版本的 sort,可不稳定嘛
  2. partial_sort:TopN → 我只要前几名,名次要的呀
  3. nth_element:BestN → 选出前几名,名次不重要 👈 PS:命名乱了呀,乱了呀,应该叫 nth-sort 呀
  4. nth_element:选出最中间那个,nth_element(begin(v), begin(v) + v.size()/2, end(v)) 
  5. minmax_element:只要极端的最大、最小值
  6. partition:自定义规则,把元素分成两部分。🤦‍ 还能再明显点嘛,这不就是快排得 partition 操作 🐎
  7. sort:上面都不行,你再找它,毕竟上面的细节满分,具体场景下,可能更加高效

其它排序:有序容器?有序。无序容器?不需要排序。链表?本分用 对象.sort() 。链表特殊,C++ 独自特化了一个排序给它。 

干点正事 👇

539. 最小时间差:题目理解 → 找到最近的两个时间点相差的分钟数。 一看就懂,一做就 👇 
时间循环这事,我推来推去,推到穷乡僻壤 🔪

class Solution {
public:
    int findMinDifference(vector<string>& timePoints) {
        vector<int> ret;
        // 字符串时间 转成 分钟,并排序
        for(const string& t : timePoints) {
            ret.push_back(stoi(t.substr(0,2))*60 + stoi(t.substr(3)));
        }
        sort(begin(ret), end(ret));
        
        int min_dis = 1440;
        // 线性 最小时间
        for(int i=1; i<ret.size(); i++) {
            min_dis = min(min_dis,ret[i]-ret[i-1]);
        }
        // 时间循环 → ↓
        return min(ret[0] - ret[ret.size()-1] + 1440, min_dis);
    }
};

 881. 救生艇:题目理解 → 意外发生,船有限重且限载 2 人,已知这些人,需要多少船?请有感情的回答 
>>> 数据说明,请挥着敬畏的心读完   people[i] <= limit(不需要考虑大于)

  1. 按照体重排序升序排序
  2. 左面的瘦子,只有被带的份,右面胖子绝对主动权
  3. 带不带左面的瘦子,右面的胖子都能一个船走
  4. 我是胖子💯💯💯,哈哈哈哈 ~~~ 
class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
        // people[i] <= limit
        sort(begin(people), end(people));

        int res = 0;
        int lo=0, hi = people.size() - 1;   // 双指针,左右开弓
        
        while(lo < hi) {
            // 左面的瘦子,只有被带的份,没有主动权
            if(people[lo] + people[hi] <= limit) lo ++;
            // 带不带左面的瘦子,右面的胖子都能一个船走
            hi --;
            res ++;
        }

        if(lo == hi) res ++;
        return res;
    }
};

164. 最大间距:题目理解 →  排序后找到相邻元素的最大间距 🗡 尊重一下 红题

class Solution {
public:
    int maximumGap(vector<int>& nums) {
        int N = nums.size();
        if(N < 2) return 0;

        sort(nums.begin(), nums.end());

        unsigned int distance = 0;

        for(int i = 0; i < N-1; i++) {
            if(nums[i+1] - nums[i] > distance) {
                distance = nums[i+1] - nums[i];
            }
        }

        return distance;
    }
};

四、写给明天

多美美好的一天呀~~ 喜刷刷,喜刷刷 😀😀😀 喜刷刷 刷刷~ 😀😀😀 ~ 

明早,要不试试早期?试试就试试 ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老坛算粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值