文章目录
目录
文章目录
零、写在前面
一、最小时间差
二、有序数组的平方
三、优势洗牌 (不会,以后二刷的时候填上)
四、救生艇
零、写在前面
真的是难啊 QAQ QAQ
本章知识回顾:这一章主要描述了快速排序的方法
动图建议手机录下来然后0.5倍速暂停着看(有动图)
《算法零基础100讲》(第37讲) 排序进阶 - 快速排序_英雄哪里出来-CSDN博客快速排序,真的够快吗?https://blog.csdn.net/WhereIsHeroFrom/article/details/121551692每天会开启一篇试读文章,每日坚持打卡就可以一直白嫖哦
void Swap(int *a, int *b) {// 交换两个数的位置
int tmp = *a;
*a = *b;
*b = tmp;
}
int Partition(int a[], int l, int r){ //
int i, j, pivox;
int idx = l + rand() % (r - l + 1); // 随机取基准数下标,rand()函数生成随机数对数组长度
//求余
pivox = a[idx]; // 基准数
Swap(&a[l], &a[idx]); //把基准数换到第一个位置
i = j = l + 1; //初始化下标,准备开始遍历
while( i <= r ) { //遍历到最右端
if(a[i] < pivox) { //当++i之后再进入循环时候,i和j交换就是了两个不同数交换了
Swap(&a[i], &a[j]); //就是a[i]遍历时候先大于pivox,再小于pivox的时候
++j; //就会把大的数换到数组后边
}
++i; //
}
Swap(&a[l], &a[j-1]); // 把a[l]换到第一个大于pivox的数前面
return j-1; //返回以已经确认的这个基准数的位置//这样就保证了前边数小于pivox后边数大于pivox
}
//递归进行划分
void QuickSort(int a[], int l, int r){
if(l < r){
int mid = Partition(a, l, r); //递归分段
QuickSort(a, l, mid-1);
QuickSort(a, mid+1, r);
}
}
一、最小时间差
1.题目
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
输入:timePoints = ["23:59","00:00"]
输出:1
力扣https://leetcode-cn.com/problems/minimum-time-difference/
2.题解
思路;排序,相邻的相减,第一个和最后一个再减一下,找最小的
void swap(int*a,int*b){
int tmp=*a;
*a=*b;
*b=tmp;
}
int Partition(int a[],int l,int r){
int i,j,pivox;
int idx=l+rand()%(r-l+1);
pivox=a[idx];
swap(&a[l],&a[idx]);
i=j=l+1;
while(i<=r){
if(a[i]sum?sum:ans;
}
if(nums[0]+1440-nums[timePointsSize-1]
3.结果
二、有序数组的平方
1.题目
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
力扣https://leetcode-cn.com/problems/squares-of-a-sorted-array/
2.题解
思路:平方后存在数组里,然后一个快速排序
void swap(int*a,int*b){
int tmp=*a;
*a=*b;
*b=tmp;
}
int Partition(int a[],int l,int r){
int i,j,pivox;
int idx=l+rand()%(r-l+1);
pivox=a[idx];
i=j=l+1;
swap(&a[l],&a[idx]);
while(i<=r){
if(a[i]
3.结果
三、优势洗牌 (不会,以后二刷的时候填上)
1.题目
给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。
返回 A 的任意排列,使其相对于 B 的优势最大化。
示例 1:
输入:A = [2,7,11,15], B = [1,10,4,11]
输出:[2,11,7,15]
力扣https://leetcode-cn.com/problems/advantage-shuffle/2.解题
3.结果
四、救生艇
1.题目
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回载到每一个人所需的最小船数。(保证每个人都能被船载)。
示例 1:
输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)
力扣https://leetcode-cn.com/problems/boats-to-save-people/
2.题解
思路:先排序,然后头尾双指针 ,先看尾,能和头一船,ans++,然后头++(并标记已经上船了),尾-- 不能一船,ans++,尾--,头不变 一直到头大于尾
void swap(int*a,int*b){
int tmp=*a;
*a=*b;
*b=tmp;
}
int Partition(int a[],int l,int r){
int i,j,pivox;
int idx=l+rand()%(r-l+1);
pivox=a[idx];
i=j=l+1;
swap(&a[l],&a[idx]);
while(i<=r){
if(a[i]
3.结果


![[万人前提计划]《算法零基础100讲》(第37讲) 排序进阶 - 快速排序——习题(C语言)(超简单易懂)φ(゜▽゜*)♪ [万人前提计划]《算法零基础100讲》(第37讲) 排序进阶 - 快速排序——习题(C语言)(超简单易懂)φ(゜▽゜*)♪](http://www.mshxw.com/aiimages/31/629018.png)
