千山万水总有路,勇敢迈出第一步!!!
今日套餐【1 红 3 橙 4 绿 】,竟然看到了红题。BUT 对我而言,最小时间差 才是真的 红 👈 山丹丹花开红艳艳的 红 !
【言前面】排序很重要,和我一样重要。如果,数组、指针说的是查找,今天就是排序 👈 废话 🤦👉 我只用到了以下排序的知识
- std::sort(begin(vec), end(vec));
- 参考 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 上调用
- stable_sort:排序后,仍能保持元素的相对顺序,好稳定的。stable 版本的 sort,可不稳定嘛
- partial_sort:TopN → 我只要前几名,名次要的呀
- nth_element:BestN → 选出前几名,名次不重要 👈 PS:命名乱了呀,乱了呀,应该叫 nth-sort 呀
- nth_element:选出最中间那个,nth_element(begin(v), begin(v) + v.size()/2, end(v))
- minmax_element:只要极端的最大、最小值
- partition:自定义规则,把元素分成两部分。🤦 还能再明显点嘛,这不就是快排得 partition 操作 🐎
- 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(不需要考虑大于)
- 按照体重排序升序排序
- 左面的瘦子,只有被带的份,右面胖子绝对主动权
- 带不带左面的瘦子,右面的胖子都能一个船走
- 我是胖子💯💯💯,哈哈哈哈 ~~~
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;
}
};
四、写给明天
多美美好的一天呀~~ 喜刷刷,喜刷刷 😀😀😀 喜刷刷 刷刷~ 😀😀😀 ~
明早,要不试试早期?试试就试试 ~